<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>WriteFreely &amp;mdash; Matt&#39;s Dev Log</title>
    <link>https://matt.writefreely.dev/tag:WriteFreely</link>
    <description></description>
    <pubDate>Sun, 03 May 2026 12:09:57 +0000</pubDate>
    <item>
      <title>Testing WYSIWYG</title>
      <link>https://matt.writefreely.dev/testing-wysiwyg</link>
      <description>&lt;![CDATA[Our WYSIWYG editor is nearly ready to be merged. So I’m testing it out a bit here.&#xA;&#xA;It would be nice to have code blocks; this doesn’t exist.&#xA;&#xA;I hoped em dashes would only be inserted as double-hyphens — are they? (no, they’re still magic hyphens)&#xA;&#xA;Finally, we’ll publish with Ctrl+Enter.&#xA;&#xA;WriteFreely&#xA;&#xA;---&#xD;&#xA;&#xD;&#xA;Get future updates via RSS and ActivityPub: @devlog@matt.writefreely.dev.]]&gt;</description>
      <content:encoded><![CDATA[<p>Our <a href="https://github.com/writeas/writefreely/pull/383">WYSIWYG editor</a> is nearly ready to be merged. So I’m testing it out a bit here.</p>

<p><code>It would be nice to have code blocks; this doesn’t exist.</code></p>

<p>I hoped em dashes would only be inserted as double-hyphens — are they? (no, they’re still magic hyphens)</p>

<p>Finally, we’ll publish with Ctrl+Enter.</p>

<p><a href="https://matt.writefreely.dev/tag:WriteFreely" class="hashtag"><span>#</span><span class="p-category">WriteFreely</span></a></p>

<hr>

<p>Get future updates via <a href="https://matt.writefreely.dev/feed/">RSS</a> and ActivityPub: <a href="https://matt.writefreely.dev/@/devlog@matt.writefreely.dev" class="u-url mention">@<span>devlog@matt.writefreely.dev</span></a>.</p>
]]></content:encoded>
      <guid>https://matt.writefreely.dev/testing-wysiwyg</guid>
      <pubDate>Wed, 24 Feb 2021 15:00:34 +0000</pubDate>
    </item>
    <item>
      <title>Hello world</title>
      <link>https://matt.writefreely.dev/hello-world-rvwl</link>
      <description>&lt;![CDATA[This is some text.&#xA;&#xA;Bold some text.&#xA;New line&#xA;and funky    spacing    ksjfdwkl&#xA;&#xA;\#WriteFreely #test&#xA;&#xA;---&#xD;&#xA;&#xD;&#xA;Get future updates via RSS and ActivityPub: @devlog@matt.writefreely.dev.]]&gt;</description>
      <content:encoded><![CDATA[<p>This is some text.</p>

<p><strong>Bold</strong> some text.
New line
and funky    spacing    ksjfdwkl</p>

<p>#WriteFreely <a href="https://matt.writefreely.dev/tag:test" class="hashtag"><span>#</span><span class="p-category">test</span></a></p>

<hr>

<p>Get future updates via <a href="https://matt.writefreely.dev/feed/">RSS</a> and ActivityPub: <a href="https://matt.writefreely.dev/@/devlog@matt.writefreely.dev" class="u-url mention">@<span>devlog@matt.writefreely.dev</span></a>.</p>
]]></content:encoded>
      <guid>https://matt.writefreely.dev/hello-world-rvwl</guid>
      <pubDate>Mon, 11 Jan 2021 19:49:23 +0000</pubDate>
    </item>
    <item>
      <title>Hello world</title>
      <link>https://matt.writefreely.dev/hello-world-nfg5</link>
      <description>&lt;![CDATA[This is some text.&#xA;&#xA;Bold some text.\&#xA;New line\&#xA;and funky    spacing   ksjdf&#xA;&#xA;\#WriteFreely #test&#xA;&#xA;---&#xD;&#xA;&#xD;&#xA;Get future updates via RSS and ActivityPub: @devlog@matt.writefreely.dev.]]&gt;</description>
      <content:encoded><![CDATA[<p>This is some text.</p>

<p><strong>Bold</strong> some text.\
New line\
and funky    spacing   ksjdf</p>

<p>#WriteFreely <a href="https://matt.writefreely.dev/tag:test" class="hashtag"><span>#</span><span class="p-category">test</span></a></p>

<hr>

<p>Get future updates via <a href="https://matt.writefreely.dev/feed/">RSS</a> and ActivityPub: <a href="https://matt.writefreely.dev/@/devlog@matt.writefreely.dev" class="u-url mention">@<span>devlog@matt.writefreely.dev</span></a>.</p>
]]></content:encoded>
      <guid>https://matt.writefreely.dev/hello-world-nfg5</guid>
      <pubDate>Mon, 16 Nov 2020 15:12:14 +0000</pubDate>
    </item>
    <item>
      <title>Some federation</title>
      <link>https://matt.writefreely.dev/some-federation</link>
      <description>&lt;![CDATA[In #WriteFreely we support not only following blogs from the fediverse, but also #hashtags and @-mentions.&#xA;&#xA;Hashtagged posts will show up in searches from the fediverse (when someone on your instance follows your blog), and you can @-mention someone to send them a notification and continue the conversation.&#xA;&#xA;Comments? Let me know @matt@writing.exchange.&#xA;&#xA;---&#xD;&#xA;&#xD;&#xA;Get future updates via RSS and ActivityPub: @devlog@matt.writefreely.dev.]]&gt;</description>
      <content:encoded><![CDATA[<p>In <a href="https://matt.writefreely.dev/tag:WriteFreely" class="hashtag"><span>#</span><span class="p-category">WriteFreely</span></a> we support not only following blogs from the fediverse, but also <a href="https://matt.writefreely.dev/tag:hashtags" class="hashtag"><span>#</span><span class="p-category">hashtags</span></a> and @-mentions.</p>

<p>Hashtagged posts will show up in searches from the fediverse (when someone on your instance follows your blog), and you can @-mention someone to send them a notification and continue the conversation.</p>

<p>Comments? Let me know <a href="https://matt.writefreely.dev/@/matt@writing.exchange" class="u-url mention">@<span>matt@writing.exchange</span></a>.</p>

<hr>

<p>Get future updates via <a href="https://matt.writefreely.dev/feed/">RSS</a> and ActivityPub: <a href="https://matt.writefreely.dev/@/devlog@matt.writefreely.dev" class="u-url mention">@<span>devlog@matt.writefreely.dev</span></a>.</p>
]]></content:encoded>
      <guid>https://matt.writefreely.dev/some-federation</guid>
      <pubDate>Tue, 10 Nov 2020 16:58:09 +0000</pubDate>
    </item>
    <item>
      <title>WYSIWYG editor</title>
      <link>https://matt.writefreely.dev/wysiwyg-editor</link>
      <description>&lt;![CDATA[I’ve just updated this instance to the wysiwyg branch of WriteFreely, where we have a new what you see is what you get editor to choose from. Work on this editor is in progress on #383.&#xA;&#xA;I’m now writing with that editor. (You can view the raw output here.)&#xA;&#xA;It’s built on ProseMirror, and gives you a more classic writing experience while converting everything to Markdown (as WriteFreely understands) behind the scenes.&#xA;&#xA;It also auto-saves, just like any other standard editor that comes with WF. I’ve refreshed the page a few times (saving everything to the clipboard first) and it’s always sucessfully loaded. This is the most basic requirement for our editors, so that’s great!&#xA;&#xA;Some issues&#xA;&#xA;It does seem to insert magic quotes in the editor (“ instead of &#34;), which is not what we want — that happens automatically on the rendering side, which is good (it seems to do it for em-dashes too).&#xA;&#xA;I’m not sure if our shortcodes will work, like !—more— — especially with the auto-em-dash stuff.&#xA;&#xA;Also, the scroll bar is right next to the text instead of outside the text area padding, which is un-ideal, but fine.&#xA;&#xA;Poetry\&#xA;probably\&#xA;     b  r  e   a    k s\&#xA;(It doesn’t completely! But the spaces before “breaks” gets removed when going back into the editor to update the post.)&#xA;&#xA;Ctrl+K should add a link to the selected text. Also “Target” in that modal is confusing even to me. Hopefully we can fix that.&#xA;&#xA;The editor doesn’t render HTML.&#xA;&#xA;The editor inserts a backslash on the following before the first # symbol, preventing the hashtag from activating.&#xA;&#xA;\#WriteFreely #wfdev&#xA;&#xA;---&#xD;&#xA;&#xD;&#xA;Get future updates via RSS and ActivityPub: @devlog@matt.writefreely.dev.]]&gt;</description>
      <content:encoded><![CDATA[<p>I’ve just updated this instance to the <code>wysiwyg</code> branch of WriteFreely, where we have a new <em>what you see is what you get</em> editor to choose from. Work on this editor is in progress on <a href="https://github.com/writeas/writefreely/pull/383">#383</a>.</p>

<p>I’m now writing with that editor. (You can <a href="https://matt.writefreely.dev/wysiwyg-editor.md">view the raw output here</a>.)</p>

<p>It’s built on <a href="https://prosemirror.net/">ProseMirror</a>, and gives you a more classic writing experience while converting everything to Markdown (as WriteFreely understands) behind the scenes.</p>

<p>It also auto-saves, just like any other standard editor that comes with WF. I’ve refreshed the page a few times (saving everything to the clipboard first) and it’s always sucessfully loaded. This is the most basic requirement for our editors, so that’s great!</p>

<h2 id="some-issues">Some issues</h2>

<p>It <em>does</em> seem to insert magic quotes in the editor (<code>“</code> instead of “), which is not what we want — that happens automatically on the rendering side, which is good (it seems to do it for em-dashes too).</p>

<p>I’m not sure if our shortcodes will work, like <code>&lt;!—more—&gt;</code> — especially with the auto-em-dash stuff.</p>

<p>Also, the scroll bar is right next to the text instead of outside the text area padding, which is un-ideal, but fine.</p>

<p>Poetry\
probably\
     b  r  e   a    k s\
(It doesn’t completely! But the spaces before “breaks” gets removed when going back into the editor to update the post.)</p>

<p>Ctrl+K should add a link to the selected text. Also “Target” in that modal is confusing even to me. Hopefully we can fix that.</p>

<p>The editor doesn’t render HTML.</p>

<p>The editor inserts a backslash on the following before the first <code>#</code> symbol, preventing the hashtag from activating.</p>

<p>#WriteFreely <a href="https://matt.writefreely.dev/tag:wfdev" class="hashtag"><span>#</span><span class="p-category">wfdev</span></a></p>

<hr>

<p>Get future updates via <a href="https://matt.writefreely.dev/feed/">RSS</a> and ActivityPub: <a href="https://matt.writefreely.dev/@/devlog@matt.writefreely.dev" class="u-url mention">@<span>devlog@matt.writefreely.dev</span></a>.</p>
]]></content:encoded>
      <guid>https://matt.writefreely.dev/wysiwyg-editor</guid>
      <pubDate>Thu, 10 Sep 2020 19:26:21 +0000</pubDate>
    </item>
    <item>
      <title>Creating a New WriteFreely Editor</title>
      <link>https://matt.writefreely.dev/creating-a-new-writefreely-editor</link>
      <description>&lt;![CDATA[WriteFreely allows instance admins to choose the writing experience their users enjoy. This guide will walk you through building and integrating a new editor. !--more--&#xA;&#xA;Overview&#xA;&#xA;Building a new editor involves a few steps:&#xA;&#xA;Create a new editor template file in the templates/ directory&#xA;Implement the editor&#xA;Set editor = TEMPLATENAME in your configuration file&#xA;Start WriteFreely&#xA;&#xA;Background&#xA;&#xA;In the vast majority of cases, creating a new editor will only involve client-side work. You do not need to build WriteFreely; you can simply download the latest version, create a new template file, and configure your instance to use the new editor.&#xA;&#xA;WriteFreely uses Go&#39;s text/template and html/template libraries for templating. You can find more information about syntax on those help pages.&#xA;&#xA;Prior Art&#xA;&#xA;Today, WriteFreely has two editors to choose from:&#xA;&#xA;pad (default)&#xA;bare&#xA;&#xA;We recommend looking at these files for help in implementing your own editor.&#xA;&#xA;Getting Started&#xA;&#xA;To start, we&#39;ll copy the pad.tmpl template and then modify it to meet your needs. For illustrative purposes, we&#39;ll call this new file fancy.tmpl throughout this tutorial.&#xA;&#xA;Writing UX&#xA;&#xA;At minimum, you&#39;ll want to allow the user to submit a new post, containing a title and a body. The user should be able to load an existing post into the editor, modify it, and publish any updates. Lastly, the editor should automatically save via localStorage (details below).&#xA;&#xA;A very basic editor looks like the one you&#39;ll find in pad.tmpl (source):&#xA;&#xA;textarea id=&#34;writer&#34; placeholder=&#34;Write...&#34; class=&#34;{{.Post.Font}}&#34; autofocus{{if .Post.Title}}# {{.Post.Title}}&#xA;&#xA;{{end}}{{.Post.Content}}/textarea&#xA;&#xA;This single template is used for both new and existing posts. When a user is editing a post, the {{.Post}} struct will be populated (containing these fields). Otherwise it and all of its fields will be empty / evaluate to false, as dictated by the text/template library.&#xA;&#xA;In the case of our bare minimum editor, when editing a post:&#xA;&#xA;The textarea uses the post&#39;s chosen font as its CSS class, ensuring that text renders in the correct font (relevant CSS here).&#xA;If the post has a title ({{if .Post.Title}}), it inserts a Markdown H1 header (# {{.Post.Title}}) and two line breaks.&#xA;Finally, it fills in the rest of the textarea with the raw contents of the post ({{.Post.Content}})&#xA;&#xA;Combine these basic elements to populate the editor when editing a post.&#xA;&#xA;Auto-save&#xA;&#xA;In pad.tmpl, drafts are automatically saved while a user types (relevant lines).&#xA;&#xA;TODO: details&#xA;&#xA;Publishing&#xA;&#xA;TODO_&#xA;&#xA;Testing&#xA;&#xA;Assuming a template file named fancy.tmpl, you&#39;ll now set editor = fancy in your configuration file. Finally, run WriteFreely and log in to see the new editor in action.&#xA;&#xA;WriteFreely&#xA;&#xA;---&#xD;&#xA;&#xD;&#xA;Get future updates via RSS and ActivityPub: @devlog@matt.writefreely.dev.]]&gt;</description>
      <content:encoded><![CDATA[<p>WriteFreely allows instance admins to choose the writing experience their users enjoy. This guide will walk you through building and integrating a new editor. </p>

<h2 id="overview">Overview</h2>

<p>Building a new editor involves a few steps:</p>
<ol><li>Create a new editor template file in the <a href="https://github.com/writeas/writefreely/tree/develop/templates"><code>templates/</code></a> directory</li>
<li>Implement the editor</li>
<li>Set <code>editor = TEMPLATE_NAME</code> in your configuration file</li>
<li>Start WriteFreely</li></ol>

<h2 id="background">Background</h2>

<p>In the vast majority of cases, creating a new editor will only involve <strong>client-side</strong> work. You do not need to <a href="https://writefreely.org/docs/latest/developer/setup">build WriteFreely</a>; you can simply <a href="https://github.com/writeas/writefreely/releases/latest">download the latest version</a>, create a new template file, and configure your instance to use the new editor.</p>

<p>WriteFreely uses Go&#39;s <a href="https://golang.org/pkg/text/template/"><code>text/template</code></a> and <a href="https://golang.org/pkg/html/template/"><code>html/template</code></a> libraries for templating. You can find more information about syntax on those help pages.</p>

<h3 id="prior-art">Prior Art</h3>

<p>Today, WriteFreely has two editors to choose from:</p>
<ul><li><a href="https://github.com/writeas/writefreely/blob/develop/templates/pad.tmpl">pad</a> (default)</li>
<li><a href="https://github.com/writeas/writefreely/blob/develop/templates/bare.tmpl">bare</a></li></ul>

<p>We recommend looking at these files for help in implementing your own editor.</p>

<h2 id="getting-started">Getting Started</h2>

<p>To start, we&#39;ll copy the <code>pad.tmpl</code> template and then modify it to meet your needs. For illustrative purposes, we&#39;ll call this new file <code>fancy.tmpl</code> throughout this tutorial.</p>

<h2 id="writing-ux">Writing UX</h2>

<p>At minimum, you&#39;ll want to allow the user to submit a new post, containing a title and a body. The user should be able to load an existing post into the editor, modify it, and publish any updates. Lastly, the editor should automatically save via <code>localStorage</code> (details below).</p>

<p>A very basic editor looks like the one you&#39;ll find in <code>pad.tmpl</code> (<a href="https://github.com/writeas/writefreely/blob/d8019bba0deee927da0316a3fe4a9cf166d56c22/templates/pad.tmpl#L16-L18">source</a>):</p>

<pre><code class="language-html">&lt;textarea id=&#34;writer&#34; placeholder=&#34;Write...&#34; class=&#34;{{.Post.Font}}&#34; autofocus&gt;{{if .Post.Title}}# {{.Post.Title}}

{{end}}{{.Post.Content}}&lt;/textarea&gt;
</code></pre>

<p>This single template is used for both new and existing posts. When a user is editing a post, the <code>{{.Post}}</code> struct will be populated (containing <a href="https://github.com/writeas/writefreely/blob/dfa14c9c92937e9806327f97847e4b9440f3b7be/posts.go#L131-L146">these fields</a>). Otherwise it and all of its fields will be empty / evaluate to <code>false</code>, as dictated by the <code>text/template</code> library.</p>

<p>In the case of our bare minimum editor, when editing a post:</p>
<ul><li>The <code>textarea</code> uses the post&#39;s <a href="https://developers.write.as/docs/api/#posts">chosen font</a> as its CSS class, ensuring that text renders in the correct font (<a href="https://github.com/writeas/writefreely/blob/dfa14c9c92937e9806327f97847e4b9440f3b7be/less/core.less#L540-L549">relevant CSS here</a>).</li>
<li>If the post has a title (<code>{{if .Post.Title}}</code>), it inserts a Markdown H1 header (<code># {{.Post.Title}}</code>) and two line breaks.</li>
<li>Finally, it fills in the rest of the <code>textarea</code> with the raw contents of the post (<code>{{.Post.Content}}</code>)</li></ul>

<p>Combine these basic elements to populate the editor when editing a post.</p>

<h3 id="auto-save">Auto-save</h3>

<p>In <code>pad.tmpl</code>, drafts are automatically saved while a user types (<a href="https://github.com/writeas/writefreely/blob/d8019bba0deee927da0316a3fe4a9cf166d56c22/templates/pad.tmpl#L381-L393">relevant lines</a>).</p>

<p><em>TODO: details</em></p>

<h2 id="publishing">Publishing</h2>

<p><em>TODO</em></p>

<h2 id="testing">Testing</h2>

<p>Assuming a template file named <code>fancy.tmpl</code>, you&#39;ll now set <code>editor = fancy</code> in your configuration file. Finally, run WriteFreely and log in to see the new editor in action.</p>

<p><a href="https://matt.writefreely.dev/tag:WriteFreely" class="hashtag"><span>#</span><span class="p-category">WriteFreely</span></a></p>

<hr>

<p>Get future updates via <a href="https://matt.writefreely.dev/feed/">RSS</a> and ActivityPub: <a href="https://matt.writefreely.dev/@/devlog@matt.writefreely.dev" class="u-url mention">@<span>devlog@matt.writefreely.dev</span></a>.</p>
]]></content:encoded>
      <guid>https://matt.writefreely.dev/creating-a-new-writefreely-editor</guid>
      <pubDate>Mon, 31 Aug 2020 23:43:54 +0000</pubDate>
    </item>
    <item>
      <title>Data Format for WriteFreely Import</title>
      <link>https://matt.writefreely.dev/data-format-for-writefreely-import</link>
      <description>&lt;![CDATA[To import posts into WriteFreely from an outside platform, it is ideal to get all articles into a JSON document that looks like the following, where each object in the array is a complete article:&#xA;&#xA;[&#xA;  {&#xA;    &#34;title&#34;: &#34;Optional Post Title&#34;,&#xA;    &#34;slug&#34;: &#34;optional-post-title&#34;,&#xA;    &#34;body&#34;: &#34;Entire post content, in Markdown or HTML, including any images and #hashtags.\n\nNote: newlines should be preserved in this field, even when using HTML.&#34;,&#xA;    &#34;font&#34;: &#34;serif&#34;,&#xA;    &#34;lang&#34;: &#34;en&#34;,&#xA;    &#34;rtl&#34;: false,&#xA;    &#34;created&#34;: &#34;2006-01-02T15:04:05Z&#34;&#xA;  }&#xA;]&#xA;&#xA;These field names map directly to the API -- you can read details in the API documentation. Otherwise, a few notes:&#xA;&#xA;The slug should contain only alphanumerics and hypens. Any invalid characters will be automatically converted.&#xA;&#xA;The body property should include all original markup (HTML) and Markdown, with newlines (WriteFreely respects and requires newline literals). Note: Getting as close to Markdown / plain text as possible here is ideal, as it provides the best editing and data export experience. But WF will render HTML.&#xA;&#xA;Include any categories or tags as #hashtags, inline in the body. To make it look nice, you might append any to the end of the post, separated from the post body by \n\n.&#xA;&#xA;Supply a created time, in the RFC3339 format (shown above) and converted to the UTC timezone, to preserve original publish date and time.&#xA;&#xA;In this format, we can trivially loop through the array of objects and POST each one directly to the WriteFreely API -- creating either drafts or blog posts.&#xA;&#xA;\#WriteFreely #import #dataMigration&#xA;&#xA;---&#xD;&#xA;&#xD;&#xA;Get future updates via RSS and ActivityPub: @devlog@matt.writefreely.dev.]]&gt;</description>
      <content:encoded><![CDATA[<p>To import posts into WriteFreely from an outside platform, it is <em>ideal</em> to get all articles into a JSON document that looks like the following, where each object in the array is a complete article:</p>

<pre><code class="language-json">[
  {
    &#34;title&#34;: &#34;Optional Post Title&#34;,
    &#34;slug&#34;: &#34;optional-post-title&#34;,
    &#34;body&#34;: &#34;Entire post content, in Markdown or HTML, including any images and #hashtags.\n\nNote: newlines should be preserved in this field, even when using HTML.&#34;,
    &#34;font&#34;: &#34;serif&#34;,
    &#34;lang&#34;: &#34;en&#34;,
    &#34;rtl&#34;: false,
    &#34;created&#34;: &#34;2006-01-02T15:04:05Z&#34;
  }
]
</code></pre>

<p>These field names map directly to the API — you can read details in <a href="https://developers.write.as/docs/api/#publish-a-collection-post">the API documentation</a>. Otherwise, a few notes:</p>
<ul><li><p>The <code>slug</code> should contain only alphanumerics and hypens. Any invalid characters will be automatically converted.</p></li>

<li><p>The <code>body</code> property should include all original markup (HTML) and Markdown, with newlines (WriteFreely respects and <em>requires</em> newline literals). <strong>Note:</strong> Getting as close to Markdown / plain text as possible here is <em>ideal</em>, as it provides the best editing and data export experience. But WF <em>will</em> render HTML.</p></li>

<li><p>Include any categories or tags as <a href="https://matt.writefreely.dev/tag:hashtags" class="hashtag"><span>#</span><span class="p-category">hashtags</span></a>, inline in the <code>body</code>. To make it look nice, you might append any to the end of the post, separated from the post body by <code>\n\n</code>.</p></li>

<li><p>Supply a <code>created</code> time, in the RFC3339 format (shown above) and converted to the UTC timezone, to preserve original publish date and time.</p></li></ul>

<p>In this format, we can trivially loop through the array of objects and <code>POST</code> each one directly to the WriteFreely API — creating either <a href="https://developers.write.as/docs/api/#publish-a-post">drafts</a> or <a href="https://developers.write.as/docs/api/#publish-a-collection-post">blog posts</a>.</p>

<p>#WriteFreely <a href="https://matt.writefreely.dev/tag:import" class="hashtag"><span>#</span><span class="p-category">import</span></a> <a href="https://matt.writefreely.dev/tag:dataMigration" class="hashtag"><span>#</span><span class="p-category">dataMigration</span></a></p>

<hr>

<p>Get future updates via <a href="https://matt.writefreely.dev/feed/">RSS</a> and ActivityPub: <a href="https://matt.writefreely.dev/@/devlog@matt.writefreely.dev" class="u-url mention">@<span>devlog@matt.writefreely.dev</span></a>.</p>
]]></content:encoded>
      <guid>https://matt.writefreely.dev/data-format-for-writefreely-import</guid>
      <pubDate>Thu, 20 Aug 2020 13:26:43 +0000</pubDate>
    </item>
    <item>
      <title>I&#39;m Back</title>
      <link>https://matt.writefreely.dev/im-back</link>
      <description>&lt;![CDATA[I took a bit of a break from #WriteFreely development over the past few months, after our v0.12 release. Now I&#39;m back to it.!--more--&#xA;&#xA;First, personally, I took a step back from almost everything in June -- I needed to spend more time around other people, friends and family, and less time thinking about code. But when I was in front of a computer, I had my focus on the new &#34;collaborative blogs&#34; feature we recently launched on Write.as. This was a crucial step for us as we work toward sustainability as a project.&#xA;&#xA;Now I&#39;ll be addressing bug reports and pull requests over the next several days / week. Keep an eye on the GitHub repo and @writeas_dev@abunchtell.com for updates!&#xA;&#xA;---&#xD;&#xA;&#xD;&#xA;Get future updates via RSS and ActivityPub: @devlog@matt.writefreely.dev.]]&gt;</description>
      <content:encoded><![CDATA[<p>I took a bit of a break from <a href="https://matt.writefreely.dev/tag:WriteFreely" class="hashtag"><span>#</span><span class="p-category">WriteFreely</span></a> development over the past few months, after our v0.12 release. Now I&#39;m back to it.</p>

<p>First, personally, I took a step back from almost everything in June — I needed to spend more time around other people, friends and family, and less time thinking about code. But when I <em>was</em> in front of a computer, I had my focus on the new “collaborative blogs” feature we <a href="https://discuss.write.as/t/new-collaborative-blogs/1608">recently launched</a> on Write.as. This was a crucial step for us as we work toward sustainability as a project.</p>

<p>Now I&#39;ll be addressing <a href="https://github.com/writeas/writefreely/issues">bug reports</a> and <a href="https://github.com/writeas/writefreely/pulls">pull requests</a> over the next several days / week. Keep an eye on the GitHub repo and <a href="https://matt.writefreely.dev/@/writeas_dev@abunchtell.com" class="u-url mention">@<span>writeas_dev@abunchtell.com</span></a> for updates!</p>

<hr>

<p>Get future updates via <a href="https://matt.writefreely.dev/feed/">RSS</a> and ActivityPub: <a href="https://matt.writefreely.dev/@/devlog@matt.writefreely.dev" class="u-url mention">@<span>devlog@matt.writefreely.dev</span></a>.</p>
]]></content:encoded>
      <guid>https://matt.writefreely.dev/im-back</guid>
      <pubDate>Thu, 23 Jul 2020 15:15:46 +0000</pubDate>
    </item>
    <item>
      <title>OAuth Support in WriteFreely</title>
      <link>https://matt.writefreely.dev/oauth-support-in-writefreely</link>
      <description>&lt;![CDATA[Our next release of #WriteFreely, v0.12, is shipping with OAuth 2.0 support! This will make it even easier for people to join your instance, and use WriteFreely as a complement to other tools. !--more--&#xA;&#xA;We&#39;ll support three different OAuth providers in v0.12, thanks to Nick Gerakines who laid all the OAuth groundwork and support for Write.as &amp; Slack, and Kyle Robbertze who added GitLab support.&#xA;&#xA;This development was initially driven by our Write.as for Teams service. Since Teams customers need a Write.as account for spinning up an instance and managing billing, the extra step of creating another account in WriteFreely caused plenty of confusion. Our Write.as OAuth integration helped alleviate that -- and paired with Slack sign-in, now entire teams can easily join a WF instance.&#xA;&#xA;  Aside: It&#39;s entirely possible that our locked-down &#34;Write.as&#34; provider will change into a generic &#34;WriteFreely&#34; provider in the future, if it makes sense for WF to become an OAuth provider. Especially with more federation capabilities on the reading side, multiple WF instances and identities hosted in WF could make more sense.&#xA;    Thoughts or ideas? Let me know @matt@writing.exchange.&#xA;&#xA;Next, with the start of the Debian Social team, Kyle approached us about utilizing their GitLab instance for user authentication. The timing couldn&#39;t have been better, and we were able to collaborate and merge his work on #277 in time for this next release!&#xA;&#xA;Adding a new provider&#xA;&#xA;Now that the basics are there, we&#39;d love to support new OAuth providers that will make it easier for WF communities to grow. While not completely seamless today, fortunately the work is pretty straightforward, whether you know Go or not.&#xA;&#xA;I wrote a step-by-step guide on how to modify WriteFreely for this over on the forum. Even if you haven&#39;t worked with Go before, as long as you can set up your development environment and copy some existing code, you can add a new provider.&#xA;&#xA;As mentioned in that forum topic, we&#39;re more than happy to accept new providers that&#39;ll help you and benefit many other people. So don&#39;t be afraid to reach out to us about your use case, and contribute new code for this.&#xA;&#xA;wfdev&#xA;&#xA;---&#xD;&#xA;&#xD;&#xA;Get future updates via RSS and ActivityPub: @devlog@matt.writefreely.dev.]]&gt;</description>
      <content:encoded><![CDATA[<p>Our next release of <a href="https://matt.writefreely.dev/tag:WriteFreely" class="hashtag"><span>#</span><span class="p-category">WriteFreely</span></a>, v0.12, is shipping with OAuth 2.0 support! This will make it even easier for people to join your instance, and use WriteFreely as a complement to other tools. </p>

<p>We&#39;ll support three different OAuth providers in v0.12, thanks to <a href="https://github.com/ngerakines">Nick Gerakines</a> who laid all the OAuth groundwork and support for Write.as &amp; Slack, and <a href="https://github.com/paddatrapper">Kyle Robbertze</a> who added GitLab support.</p>

<p>This development was initially driven by our <a href="https://write.as/for/teams">Write.as for Teams</a> service. Since Teams customers need a Write.as account for spinning up an instance and managing billing, the extra step of creating <em>another</em> account in WriteFreely caused plenty of confusion. Our Write.as OAuth integration helped alleviate that — and paired with Slack sign-in, now entire teams can easily join a WF instance.</p>

<blockquote><p><strong>Aside</strong>: It&#39;s entirely possible that our locked-down “Write.as” provider will change into a generic “WriteFreely” provider in the future, if it makes sense for WF to become an OAuth provider. Especially with more federation capabilities on the reading side, multiple WF instances and identities hosted in WF could make more sense.</p>

<p>Thoughts or ideas? Let me know <a href="https://matt.writefreely.dev/@/matt@writing.exchange" class="u-url mention">@<span>matt@writing.exchange</span></a>.</p></blockquote>

<p>Next, with the start of the <a href="https://wiki.debian.org/Teams/DebianSocial">Debian Social</a> team, Kyle approached us about utilizing their GitLab instance for user authentication. The timing couldn&#39;t have been better, and we were able to collaborate and merge his work on <a href="https://github.com/writeas/writefreely/pull/277">#277</a> in time for this next release!</p>

<h2 id="adding-a-new-provider">Adding a new provider</h2>

<p>Now that the basics are there, we&#39;d love to support new OAuth providers that will make it easier for WF communities to grow. While not completely seamless today, fortunately the work is pretty straightforward, whether you know Go or not.</p>

<p>I wrote a step-by-step guide on how to modify WriteFreely for this <a href="https://discuss.write.as/t/feature-suggestion-login-with-an-account-from-other-websites-e-g-mastodon-github-etc/872/8">over on the forum</a>. Even if you haven&#39;t worked with Go before, as long as you can <a href="https://writefreely.org/docs/latest/developer/setup">set up your development environment</a> and copy some existing code, you can add a new provider.</p>

<p>As mentioned in that forum topic, we&#39;re more than happy to accept new providers that&#39;ll help you and benefit many other people. So don&#39;t be afraid to <a href="https://discuss.write.as/c/development">reach out to us</a> about your use case, and contribute new code for this.</p>

<p><a href="https://matt.writefreely.dev/tag:wfdev" class="hashtag"><span>#</span><span class="p-category">wfdev</span></a></p>

<hr>

<p>Get future updates via <a href="https://matt.writefreely.dev/feed/">RSS</a> and ActivityPub: <a href="https://matt.writefreely.dev/@/devlog@matt.writefreely.dev" class="u-url mention">@<span>devlog@matt.writefreely.dev</span></a>.</p>
]]></content:encoded>
      <guid>https://matt.writefreely.dev/oauth-support-in-writefreely</guid>
      <pubDate>Wed, 25 Mar 2020 15:46:11 +0000</pubDate>
    </item>
    <item>
      <title>Upcoming Visual Changes to WriteFreely</title>
      <link>https://matt.writefreely.dev/upcoming-visual-changes-to-writefreely</link>
      <description>&lt;![CDATA[Right now, we have a pause on major features in WriteFreely. I&#39;ve finally started to work through the backlog of outstanding pull requests, some of which were from mid-2019, and now am getting to more of the polishing side of things. So coming soon, there will be some small new visual changes in WriteFreely / Write.as, particularly that affect user blogs.&#xA;&#xA;Dates on blog posts. It&#39;s been missing for years. They&#39;d show on the blog home page, but not blog posts. Well, this is no longer the case. Soon, posts on blogs that use the Blog display format will consistently show dates both on their home page and individual posts. Other display formats will continue not showing dates, because that&#39;s exactly what they&#39;re there for: not showing dates.&#xA;  Also, dates are now correct, relative to your device&#39;s timezone!&#xA;table style. These elements were previously unstyled. Now they&#39;ll have some improved, basic styling that you can easily override with custom CSS. See #194.&#xA;Consistent user page headers. User pages (Blogs, Drafts, Account Settings, etc.) were all over the map with their headers. I&#39;d start using a new style on new pages and not update the old ones. Well, now that&#39;s fixed in #262. Write.as users will notice this change is already live.&#xA;Slightly more line height. We&#39;ve added 10% more space between lines of text. It&#39;s perhaps too small to really notice, but large enough to make a nice improvement. Changes in #263.&#xA;&#xA;On the admin side, we&#39;re redesigning the dashboard to make it much more user friendly, and optionally less technical, in cases where an instance is in a hosted environment and the admin doesn&#39;t care about getting into the weeds. See #264. We need this change in Write.as for Teams, but it should also prove helpful for other WriteFreely hosts.&#xA;&#xA;Particularly since these are visible changes that affect users, we want your feedback! Please jump into those pull requests on GitHub, try things out, and let us know what you think. We want to be sure people are happy with these upcoming changes before they get released to everyone.&#xA;&#xA;#wfdev #design #WriteFreely&#xA;&#xA;---&#xD;&#xA;&#xD;&#xA;Get future updates via RSS and ActivityPub: @devlog@matt.writefreely.dev.]]&gt;</description>
      <content:encoded><![CDATA[<p>Right now, we have a pause on major features in WriteFreely. I&#39;ve finally started to work through the backlog of outstanding pull requests, some of which were from mid-2019, and now am getting to more of the <em>polishing</em> side of things. So coming soon, there will be some small new visual changes in <a href="https://writefreely.org">WriteFreely</a> / <a href="https://write.as">Write.as</a>, particularly that affect user blogs.</p>
<ul><li>Dates on blog posts. It&#39;s been missing for years. They&#39;d show on the blog home page, but not blog posts. Well, this is no longer the case. Soon, posts on blogs that use the <em>Blog</em> display format will consistently show dates both on their home page and individual posts. Other display formats will continue not showing dates, because that&#39;s exactly what they&#39;re there for: not showing dates.
<ul><li>Also, dates are now correct, relative to your device&#39;s timezone!</li></ul></li>
<li><code>&lt;table&gt;</code> style. These elements were previously unstyled. Now they&#39;ll have some improved, basic styling that you can easily override with custom CSS. See <a href="https://writefreely.org/pull/194">#194</a>.</li>
<li>Consistent user page headers. User pages (Blogs, Drafts, Account Settings, etc.) were all over the map with their headers. I&#39;d start using a new style on new pages and not update the old ones. Well, now that&#39;s fixed in <a href="https://writefreely.org/pull/262">#262</a>. Write.as users will notice this change is already live.</li>
<li>Slightly more line height. We&#39;ve added 10% more space between lines of text. It&#39;s perhaps too small to really notice, but large enough to make a nice improvement. Changes in <a href="https://writefreely.org/pull/263">#263</a>.</li></ul>

<p>On the admin side, we&#39;re redesigning the dashboard to make it much more user friendly, and optionally less technical, in cases where an instance is in a hosted environment and the admin doesn&#39;t care about getting into the weeds. See <a href="https://writefreely.org/pull/264">#264</a>. We need this change in <a href="https://write.as/for/teams">Write.as for Teams</a>, but it should also prove helpful for other WriteFreely hosts.</p>

<p>Particularly since these are visible changes that affect users, <strong>we want your feedback</strong>! Please jump into those pull requests on GitHub, try things out, and let us know what you think. We want to be sure people are happy with these upcoming changes before they get released to everyone.</p>

<p><a href="https://matt.writefreely.dev/tag:wfdev" class="hashtag"><span>#</span><span class="p-category">wfdev</span></a> <a href="https://matt.writefreely.dev/tag:design" class="hashtag"><span>#</span><span class="p-category">design</span></a> <a href="https://matt.writefreely.dev/tag:WriteFreely" class="hashtag"><span>#</span><span class="p-category">WriteFreely</span></a></p>

<hr>

<p>Get future updates via <a href="https://matt.writefreely.dev/feed/">RSS</a> and ActivityPub: <a href="https://matt.writefreely.dev/@/devlog@matt.writefreely.dev" class="u-url mention">@<span>devlog@matt.writefreely.dev</span></a>.</p>
]]></content:encoded>
      <guid>https://matt.writefreely.dev/upcoming-visual-changes-to-writefreely</guid>
      <pubDate>Fri, 14 Feb 2020 20:38:09 +0000</pubDate>
    </item>
  </channel>
</rss>