<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Outline on Producthunt daily</title>
        <link>https://producthunt.programnotes.cn/en/tags/outline/</link>
        <description>Recent content in Outline on Producthunt daily</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Thu, 31 Jul 2025 15:34:29 +0800</lastBuildDate><atom:link href="https://producthunt.programnotes.cn/en/tags/outline/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>outline</title>
        <link>https://producthunt.programnotes.cn/en/p/outline/</link>
        <pubDate>Thu, 31 Jul 2025 15:34:29 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/outline/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1656772710810-677f691cc688?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NTM5NDcyMTB8&amp;ixlib=rb-4.1.0" alt="Featured image of post outline" /&gt;&lt;h1 id=&#34;outlineoutline&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/outline/outline&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;outline/outline&lt;/a&gt;
&lt;/h1&gt;&lt;p align=&#34;center&#34;&gt;
  &lt;img src=&#34;https://user-images.githubusercontent.com/31465/34380645-bd67f474-eb0b-11e7-8d03-0151c1730654.png&#34; height=&#34;29&#34; /&gt;
&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;i&gt;A fast, collaborative, knowledge base for your team built using React and Node.js.&lt;br/&gt;Try out Outline using our hosted version at &lt;a href=&#34;https://www.getoutline.com&#34;&gt;www.getoutline.com&lt;/a&gt;.&lt;/i&gt;
  &lt;br/&gt;
  &lt;img width=&#34;1640&#34; alt=&#34;screenshot&#34; src=&#34;https://user-images.githubusercontent.com/380914/110356468-26374600-7fef-11eb-9f6a-f2cc2c8c6590.png&#34;&gt;
&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;a href=&#34;https://circleci.com/gh/outline/outline&#34; rel=&#34;nofollow&#34;&gt;&lt;img src=&#34;https://circleci.com/gh/outline/outline.svg?style=shield&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;http://www.typescriptlang.org&#34; rel=&#34;nofollow&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg&#34; alt=&#34;TypeScript&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://github.com/prettier/prettier&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat&#34; alt=&#34;Prettier&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://github.com/styled-components/styled-components&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/style-%F0%9F%92%85%20styled--components-orange.svg&#34; alt=&#34;Styled Components&#34;&gt;&lt;/a&gt;
  &lt;a href=&#34;https://translate.getoutline.com/project/outline&#34; alt=&#34;Localized&#34;&gt;&lt;img src=&#34;https://badges.crowdin.net/outline/localized.svg&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This is the source code that runs &lt;a class=&#34;link&#34; href=&#34;https://www.getoutline.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Outline&lt;/strong&gt;&lt;/a&gt; and all the associated services. If you want to use Outline then you don&amp;rsquo;t need to run this code, we offer a hosted version of the app at &lt;a class=&#34;link&#34; href=&#34;https://www.getoutline.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;getoutline.com&lt;/a&gt;. You can also find documentation on using Outline in &lt;a class=&#34;link&#34; href=&#34;https://docs.getoutline.com/s/guide&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;our guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to run your own copy of Outline or contribute to development then this is the place for you.&lt;/p&gt;
&lt;h1 id=&#34;installation&#34;&gt;Installation
&lt;/h1&gt;&lt;p&gt;Please see the &lt;a class=&#34;link&#34; href=&#34;https://docs.getoutline.com/s/hosting/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;documentation&lt;/a&gt; for running your own copy of Outline in a production configuration.&lt;/p&gt;
&lt;p&gt;If you have questions or improvements for the docs please create a thread in &lt;a class=&#34;link&#34; href=&#34;https://github.com/outline/outline/discussions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub discussions&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;development&#34;&gt;Development
&lt;/h1&gt;&lt;p&gt;There is a short guide for &lt;a class=&#34;link&#34; href=&#34;https://docs.getoutline.com/s/hosting/doc/local-development-5hEhFRXow7&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;setting up a development environment&lt;/a&gt; if you wish to contribute changes, fixes, and improvements to Outline.&lt;/p&gt;
&lt;h2 id=&#34;contributing&#34;&gt;Contributing
&lt;/h2&gt;&lt;p&gt;Outline is built and maintained by a small team – we&amp;rsquo;d love your help to fix bugs and add features!&lt;/p&gt;
&lt;p&gt;Before submitting a pull request &lt;em&gt;please&lt;/em&gt; discuss with the core team by creating or commenting in an issue on &lt;a class=&#34;link&#34; href=&#34;https://www.github.com/outline/outline/issues&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub&lt;/a&gt; – we&amp;rsquo;d also love to hear from you in the &lt;a class=&#34;link&#34; href=&#34;https://www.github.com/outline/outline/discussions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;discussions&lt;/a&gt;. This way we can ensure that an approach is agreed on before code is written. This will result in a much higher likelihood of your code being accepted.&lt;/p&gt;
&lt;p&gt;If you’re looking for ways to get started, here&amp;rsquo;s a list of ways to help us improve Outline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;docs/TRANSLATION.md&#34; &gt;Translation&lt;/a&gt; into other languages&lt;/li&gt;
&lt;li&gt;Issues with &lt;a class=&#34;link&#34; href=&#34;https://github.com/outline/outline/labels/good%20first%20issue&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;good first issue&lt;/code&gt;&lt;/a&gt; label&lt;/li&gt;
&lt;li&gt;Performance improvements, both on server and frontend&lt;/li&gt;
&lt;li&gt;Developer happiness and documentation&lt;/li&gt;
&lt;li&gt;Bugs and other issues listed on GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;re interested in contributing or learning more about the Outline codebase
please refer to the &lt;a class=&#34;link&#34; href=&#34;docs/ARCHITECTURE.md&#34; &gt;architecture document&lt;/a&gt; first for a high level overview of how the application is put together.&lt;/p&gt;
&lt;h2 id=&#34;debugging&#34;&gt;Debugging
&lt;/h2&gt;&lt;p&gt;In development Outline outputs simple logging to the console, prefixed by categories. In production it outputs JSON logs, these can be easily parsed by your preferred log ingestion pipeline.&lt;/p&gt;
&lt;p&gt;HTTP logging is disabled by default, but can be enabled by setting the &lt;code&gt;DEBUG=http&lt;/code&gt; environment variable.&lt;/p&gt;
&lt;h2 id=&#34;tests&#34;&gt;Tests
&lt;/h2&gt;&lt;p&gt;We aim to have sufficient test coverage for critical parts of the application and aren&amp;rsquo;t aiming for 100% unit test coverage. All API endpoints and anything authentication related should be thoroughly tested.&lt;/p&gt;
&lt;p&gt;To add new tests, write your tests with &lt;a class=&#34;link&#34; href=&#34;https://facebook.github.io/jest/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jest&lt;/a&gt; and add a file with &lt;code&gt;.test.js&lt;/code&gt; extension next to the tested code.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# To run all tests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# To run backend tests in watch mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make watch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Once the test database is created with &lt;code&gt;make test&lt;/code&gt; you may individually run
frontend and backend tests directly.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# To run backend tests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yarn test:server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# To run a specific backend test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yarn test:server myTestFile
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# To run frontend tests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yarn test:app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;migrations&#34;&gt;Migrations
&lt;/h2&gt;&lt;p&gt;Sequelize is used to create and run migrations, for example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yarn sequelize migration:generate --name my-migration
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yarn sequelize db:migrate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Or to run migrations on test database:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yarn sequelize db:migrate --env &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h1 id=&#34;activity&#34;&gt;Activity
&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;https://repobeats.axiom.co/api/embed/ff2e4e6918afff1acf9deb72d1ba6b071d586178.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Alt&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;license&#34;&gt;License
&lt;/h1&gt;&lt;p&gt;Outline is &lt;a class=&#34;link&#34; href=&#34;LICENSE&#34; &gt;BSL 1.1 licensed&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
