{"id":753,"date":"2023-06-23T21:45:21","date_gmt":"2023-06-23T19:45:21","guid":{"rendered":"https:\/\/thegreydiamond.de\/blog\/?p=753"},"modified":"2024-11-12T11:04:10","modified_gmt":"2024-11-12T10:04:10","slug":"enabling-hosted-features-in-outline","status":"publish","type":"post","link":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/","title":{"rendered":"Enabling &#8220;hosted&#8221; features in outline"},"content":{"rendered":"\n<div class=\"wp-block-uagb-inline-notice uagb-inline_notice__align-left uagb-block-5fa14337\"><button class=\"uagb-notice-close-button\" type=\"button\" aria-label=\"Close\"><\/button><h4 class=\"uagb-notice-title\">Attention<\/h4><div class=\"uagb-notice-text\">\n<p>The initial guide stopped working as of version v0.72.0 due to <a href=\"https:\/\/github.com\/outline\/outline\/pull\/5742\">PR#5742<\/a> which removed the variables from the .env file. I&#8217;ve updated this article to include the new way of enabling these features &#8211; but kept the old text.<\/p>\n<\/div><\/div>\n\n\n\n<p>A few days ago I discovered a nice <a href=\"https:\/\/notion.so\/\">Notion <\/a>alternative called &#8220;<a href=\"https:\/\/getoutline.com\" target=\"_blank\" rel=\"noreferrer noopener\">Outline<\/a>&#8220;. It seemed to provide a nice feature set while also being self-hosted. The setup was somewhat cumbersome, as it needs an S3 Object storage, auth provider, postgres DB and Redis server.  After setting up Keycloak for auth and MinIO for S3 Object storage I was ready to go. <\/p>\n\n\n\n<p>But there was one thing missing I knew from Notion\u2014multiple workspaces and switching between them. The UI looked like it supported context switching, though no &#8220;Create New Workspace&#8221; can be found. Digging through the web demo I found the function. The hosted version seems to support it while the self-hosted doesn&#8217;t weird. After looking through Outline&#8217;s Github issues I discovered <a href=\"https:\/\/github.com\/outline\/outline\/issues\/5041\" target=\"_blank\" rel=\"noreferrer noopener\">someone complaining<\/a> about a semi-working &#8220;Create workspace&#8221; button. <\/p>\n\n\n\n<div class=\"wp-block-uagb-image aligncenter uagb-block-6dc67b6b wp-block-uagb-image--layout-default wp-block-uagb-image--effect-static wp-block-uagb-image--align-center\"><figure class=\"wp-block-uagb-image__figure\"><img decoding=\"async\"  sizes=\"auto, (max-width: 480px) 150px\" src=\"https:\/\/cdn.thegreydiamond.de\/img\/2023\/06\/27\/2023-06-27_18-25-19-6567ba8f-f345-482e-a3cb-dd16dc6508d9.png\" alt=\"A screenshot of the working &quot;New Workspace&quot; button in Outline\" width=\"324\" height=\"264\" title=\"\" loading=\"lazy\" role=\"img\"\/><figcaption class=\"uagb-image-caption\">A screenshot of the working &#8220;New Workspace&#8221; button<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration options to get Outline working<\/h2>\n\n\n\n<p>Most configuration is done using the <code>.env<\/code> file. One option which caused the semi-working button to show up was <code>DEPLOYMENT=hosted<\/code>. And I was able to confirm this aforementioned behaviour. Indeed a &#8220;Create Workspace&#8221;-button showed up. Creating a new Workspace, however, caused weird behaviour where I was trapped in the new Workspace, unable to switch.<\/p>\n\n\n\n<p>Looking through the source code there was another interesting option SUBDOMAINS_ENABLED=true. Huh, I wonder what this does I thought while flicking it on. <\/p>\n\n\n\n<p>Upon visiting the outline subdomain I was greeted with a redirect to a subdomain &lt;workspace&gt;.outline.domain.tld. This felt like the final stretch.  I made a new certificate for *.outline subdomains and set up nginx to point them to the application as well.<\/p>\n\n\n\n<p>And boom &#8211; I got a &#8220;hosted-only&#8221; feature working on a self-hosted instance.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cool &#8211; but how to enable these features?<\/h2>\n\n\n\n<p>Before version v0.72.0 these features could be enabled by changing variables in the .env file. As of <a href=\"https:\/\/github.com\/outline\/outline\/pull\/5742\">PR#5742<\/a> this no longer works and code modification is required.<\/p>\n\n\n\n<p>There are two points in the source code where the system decides whether or not it is running a &#8220;cloud-hosted&#8221; environment. We need to modify the code, to make it think that we always run in such a hosted env. <\/p>\n\n\n\n<p>Begin by modifying the file &#8220;app\/utils\/isCloudHosted.ts&#8221; where you need to replace these lines:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const isCloudHosted = [\n  \"https:\/\/app.getoutline.com\",\n  \"https:\/\/app.outline.dev\",\n  \"https:\/\/app.outline.dev:3000\",\n].includes(env.URL);<\/code><\/pre>\n\n\n\n<p>with this single line:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const isCloudHosted = true;<\/code><\/pre>\n\n\n\n<p>Next edit the file &#8220;server\/env.ts&#8221;, where you replace:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">public get isCloudHosted() {\n    return [\n      \"https:\/\/app.getoutline.com\",\n      \"https:\/\/app.outline.dev\",\n      \"https:\/\/app.outline.dev:3000\",\n    ].includes(this.URL);\n  }<\/code><\/pre>\n\n\n\n<p>with this simple bit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">public get isCloudHosted() {\n    return true;\n}<\/code><\/pre>\n\n\n\n<p>These are all the steps necessary in order to get these hosted features back.<\/p>\n\n\n\n<p>After <strong>that you have to run <code>yarn build<\/code>.<\/strong> <br>(This is really important and more a note for future me&#8230;)<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cool &#8211; but how do I do it? &#8211; The old (and broken) way<\/h2>\n\n\n\n<p>First, add these lines to your configuration:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">DEPLOYMENT=hosted\nSUBDOMAINS_ENABLED=true<\/code><\/pre>\n\n\n\n<p>Now make sure you have SSL certificates for the subdomain you want to use. In my case *.outline.domain.tld. You can use certbot with the cloudflare-dns-challenge plugin to request fitting certificates.<\/p>\n\n\n\n<p>Next, you need to configure your nginx webserver to properly handle the new request.<\/p>\n\n\n\n<p>This is the config I&#8217;m using. This might not be perfect for your installation but should probably also work. <\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/TheGreyDiamond\/95ccfef56c06f2878c0815cc53d6a244.js\"><\/script>\n\n\n\n<p>I hope this helps someone out there and saves them at least a little time!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A few days ago I discovered a nice Notion alternative called &#8220;Outline&#8220;. It seemed to provide a nice feature set while also being self-hosted. The setup was somewhat cumbersome, as it needs an S3 Object storage, auth provider, postgres DB and Redis server. After setting up Keycloak for auth and MinIO for S3 Object storage [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"categories":[1],"tags":[105,103,102,100,104,101,99,65],"class_list":["post-753","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-cloud","tag-enable","tag-feature","tag-hosting","tag-improve","tag-notetaking","tag-outline","tag-web","post-preview"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Enabling &quot;hosted&quot; features in outline &#8211; Thegreydiamond<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Enabling &quot;hosted&quot; features in outline &#8211; Thegreydiamond\" \/>\n<meta property=\"og:description\" content=\"A few days ago I discovered a nice Notion alternative called &#8220;Outline&#8220;. It seemed to provide a nice feature set while also being self-hosted. The setup was somewhat cumbersome, as it needs an S3 Object storage, auth provider, postgres DB and Redis server. After setting up Keycloak for auth and MinIO for S3 Object storage [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/\" \/>\n<meta property=\"og:site_name\" content=\"Thegreydiamond\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-23T19:45:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-12T10:04:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.thegreydiamond.de\/img\/2023\/06\/27\/2023-06-27_18-25-19-6567ba8f-f345-482e-a3cb-dd16dc6508d9.png\" \/>\n<meta name=\"author\" content=\"TheGreydiamond\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@thegreydiamond2\" \/>\n<meta name=\"twitter:site\" content=\"@thegreydiamond2\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"TheGreydiamond\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/\"},\"author\":{\"name\":\"TheGreydiamond\",\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/#\\\/schema\\\/person\\\/a7ba7a2ca50e4001f3f8f852c079910d\"},\"headline\":\"Enabling &#8220;hosted&#8221; features in outline\",\"datePublished\":\"2023-06-23T19:45:21+00:00\",\"dateModified\":\"2024-11-12T10:04:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/\"},\"wordCount\":570,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cdn.thegreydiamond.de\\\/img\\\/2023\\\/06\\\/27\\\/2023-06-27_18-25-19-6567ba8f-f345-482e-a3cb-dd16dc6508d9.png\",\"keywords\":[\"cloud\",\"enable\",\"feature\",\"hosting\",\"improve\",\"notetaking\",\"outline\",\"web\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/\",\"url\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/\",\"name\":\"Enabling \\\"hosted\\\" features in outline &#8211; Thegreydiamond\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cdn.thegreydiamond.de\\\/img\\\/2023\\\/06\\\/27\\\/2023-06-27_18-25-19-6567ba8f-f345-482e-a3cb-dd16dc6508d9.png\",\"datePublished\":\"2023-06-23T19:45:21+00:00\",\"dateModified\":\"2024-11-12T10:04:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/#primaryimage\",\"url\":\"https:\\\/\\\/cdn.thegreydiamond.de\\\/img\\\/2023\\\/06\\\/27\\\/2023-06-27_18-25-19-6567ba8f-f345-482e-a3cb-dd16dc6508d9.png\",\"contentUrl\":\"https:\\\/\\\/cdn.thegreydiamond.de\\\/img\\\/2023\\\/06\\\/27\\\/2023-06-27_18-25-19-6567ba8f-f345-482e-a3cb-dd16dc6508d9.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/2023\\\/06\\\/23\\\/enabling-hosted-features-in-outline\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Enabling &#8220;hosted&#8221; features in outline\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/\",\"name\":\"Thegreydiamond\",\"description\":\"TheGreydiamonds Blog\",\"publisher\":{\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/#organization\",\"name\":\"TheGreydiamond\",\"url\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/logoVersuch2.png\",\"contentUrl\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/logoVersuch2.png\",\"width\":1000,\"height\":1000,\"caption\":\"TheGreydiamond\"},\"image\":{\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/thegreydiamond2\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/thegreydiamond.de\\\/blog\\\/#\\\/schema\\\/person\\\/a7ba7a2ca50e4001f3f8f852c079910d\",\"name\":\"TheGreydiamond\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/55ee91221a0c102f9e4fa464a2edf06cc82724dc4f1299c99818b23e45801a75?s=96&d=mm&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/55ee91221a0c102f9e4fa464a2edf06cc82724dc4f1299c99818b23e45801a75?s=96&d=mm&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/55ee91221a0c102f9e4fa464a2edf06cc82724dc4f1299c99818b23e45801a75?s=96&d=mm&r=pg\",\"caption\":\"TheGreydiamond\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Enabling \"hosted\" features in outline &#8211; Thegreydiamond","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/","og_locale":"en_US","og_type":"article","og_title":"Enabling \"hosted\" features in outline &#8211; Thegreydiamond","og_description":"A few days ago I discovered a nice Notion alternative called &#8220;Outline&#8220;. It seemed to provide a nice feature set while also being self-hosted. The setup was somewhat cumbersome, as it needs an S3 Object storage, auth provider, postgres DB and Redis server. After setting up Keycloak for auth and MinIO for S3 Object storage [&hellip;]","og_url":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/","og_site_name":"Thegreydiamond","article_published_time":"2023-06-23T19:45:21+00:00","article_modified_time":"2024-11-12T10:04:10+00:00","og_image":[{"url":"https:\/\/cdn.thegreydiamond.de\/img\/2023\/06\/27\/2023-06-27_18-25-19-6567ba8f-f345-482e-a3cb-dd16dc6508d9.png","type":"","width":"","height":""}],"author":"TheGreydiamond","twitter_card":"summary_large_image","twitter_creator":"@thegreydiamond2","twitter_site":"@thegreydiamond2","twitter_misc":{"Written by":"TheGreydiamond","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/#article","isPartOf":{"@id":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/"},"author":{"name":"TheGreydiamond","@id":"https:\/\/thegreydiamond.de\/blog\/#\/schema\/person\/a7ba7a2ca50e4001f3f8f852c079910d"},"headline":"Enabling &#8220;hosted&#8221; features in outline","datePublished":"2023-06-23T19:45:21+00:00","dateModified":"2024-11-12T10:04:10+00:00","mainEntityOfPage":{"@id":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/"},"wordCount":570,"commentCount":0,"publisher":{"@id":"https:\/\/thegreydiamond.de\/blog\/#organization"},"image":{"@id":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.thegreydiamond.de\/img\/2023\/06\/27\/2023-06-27_18-25-19-6567ba8f-f345-482e-a3cb-dd16dc6508d9.png","keywords":["cloud","enable","feature","hosting","improve","notetaking","outline","web"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/","url":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/","name":"Enabling \"hosted\" features in outline &#8211; Thegreydiamond","isPartOf":{"@id":"https:\/\/thegreydiamond.de\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/#primaryimage"},"image":{"@id":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.thegreydiamond.de\/img\/2023\/06\/27\/2023-06-27_18-25-19-6567ba8f-f345-482e-a3cb-dd16dc6508d9.png","datePublished":"2023-06-23T19:45:21+00:00","dateModified":"2024-11-12T10:04:10+00:00","breadcrumb":{"@id":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/#primaryimage","url":"https:\/\/cdn.thegreydiamond.de\/img\/2023\/06\/27\/2023-06-27_18-25-19-6567ba8f-f345-482e-a3cb-dd16dc6508d9.png","contentUrl":"https:\/\/cdn.thegreydiamond.de\/img\/2023\/06\/27\/2023-06-27_18-25-19-6567ba8f-f345-482e-a3cb-dd16dc6508d9.png"},{"@type":"BreadcrumbList","@id":"https:\/\/thegreydiamond.de\/blog\/2023\/06\/23\/enabling-hosted-features-in-outline\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thegreydiamond.de\/blog\/"},{"@type":"ListItem","position":2,"name":"Enabling &#8220;hosted&#8221; features in outline"}]},{"@type":"WebSite","@id":"https:\/\/thegreydiamond.de\/blog\/#website","url":"https:\/\/thegreydiamond.de\/blog\/","name":"Thegreydiamond","description":"TheGreydiamonds Blog","publisher":{"@id":"https:\/\/thegreydiamond.de\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thegreydiamond.de\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/thegreydiamond.de\/blog\/#organization","name":"TheGreydiamond","url":"https:\/\/thegreydiamond.de\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/thegreydiamond.de\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/thegreydiamond.de\/blog\/wp-content\/uploads\/2021\/09\/logoVersuch2.png","contentUrl":"https:\/\/thegreydiamond.de\/blog\/wp-content\/uploads\/2021\/09\/logoVersuch2.png","width":1000,"height":1000,"caption":"TheGreydiamond"},"image":{"@id":"https:\/\/thegreydiamond.de\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/thegreydiamond2"]},{"@type":"Person","@id":"https:\/\/thegreydiamond.de\/blog\/#\/schema\/person\/a7ba7a2ca50e4001f3f8f852c079910d","name":"TheGreydiamond","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/55ee91221a0c102f9e4fa464a2edf06cc82724dc4f1299c99818b23e45801a75?s=96&d=mm&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/55ee91221a0c102f9e4fa464a2edf06cc82724dc4f1299c99818b23e45801a75?s=96&d=mm&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/55ee91221a0c102f9e4fa464a2edf06cc82724dc4f1299c99818b23e45801a75?s=96&d=mm&r=pg","caption":"TheGreydiamond"}}]}},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"post-image":false},"uagb_author_info":{"display_name":"TheGreydiamond","author_link":"https:\/\/thegreydiamond.de\/blog\/author\/thegreydiamond\/"},"uagb_comment_info":3,"uagb_excerpt":"A few days ago I discovered a nice Notion alternative called &#8220;Outline&#8220;. It seemed to provide a nice feature set while also being self-hosted. The setup was somewhat cumbersome, as it needs an S3 Object storage, auth provider, postgres DB and Redis server. After setting up Keycloak for auth and MinIO for S3 Object storage&hellip;","_links":{"self":[{"href":"https:\/\/thegreydiamond.de\/blog\/wp-json\/wp\/v2\/posts\/753","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thegreydiamond.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thegreydiamond.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thegreydiamond.de\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thegreydiamond.de\/blog\/wp-json\/wp\/v2\/comments?post=753"}],"version-history":[{"count":0,"href":"https:\/\/thegreydiamond.de\/blog\/wp-json\/wp\/v2\/posts\/753\/revisions"}],"wp:attachment":[{"href":"https:\/\/thegreydiamond.de\/blog\/wp-json\/wp\/v2\/media?parent=753"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thegreydiamond.de\/blog\/wp-json\/wp\/v2\/categories?post=753"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thegreydiamond.de\/blog\/wp-json\/wp\/v2\/tags?post=753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}