<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Gijs Nelissen / Lifelog - All blog posts]]></title><description><![CDATA[All of my long-form thoughts on programming, leadership, product design, and more, collected in chronological order.]]></description><link>undefined</link><image><url>https://www.lifelog.be/images/avatar.jpeg</url><title>Gijs Nelissen / Lifelog - All blog posts</title><link>undefined</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 23:15:43 GMT</lastBuildDate><atom:link href="undefined/rss.xml" rel="self" type="application/rss+xml"/><item><title><![CDATA[Building an Editor: Decreasing the time to publish (by 44%)]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/ed91ce3e-0297-45de-bd57-acffb2937e01/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000017.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/671d5cff-44c0-4ec8-a397-e9624df64929/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/e40212b1-49e7-412e-b1a0-d08930b0f5b5/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000018.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/5fdb468e-d1fe-4cf3-9f68-c22242f2e305/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000019.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/e5d8f2e8-58d5-4e04-b041-559783236293/-/format/auto/CleanShot%202022-03-07%20at%2015.39.55.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/305ad2fb-d46a-4203-8249-80a64d2bf267/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000012.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/a9d5558c-4dff-44c6-9f71-b3db338c0699/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000015.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/2853cda7-5834-431a-ab8a-168ace3e2b65/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000016.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/d0f0695b-fd55-4658-9f51-f759a16c13df/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/09b87df9-77f1-4e42-a0a9-81fc5a5827af/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/76e39d83-7454-42ec-88ea-c10c13590a06/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Writing and publishing a blog post or press release is at the core of the Prezly product and we want to make it better, faster, more powerful and easier to use.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But building an editor is bloody hard and in a post last year <a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love" target="_blank" rel="noreferrer">I listed a number of things I find important</a> when it comes to the writing experience.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Since then we&#x27;ve been spending a lot of time on improving the Prezly editor. One of the ways to measure our progress is to look at the time it takes for our customers to complete the journey from creating the draft to the final publication of that story.</p><img src="https://cdn.uc.assets.prezly.com/ed91ce3e-0297-45de-bd57-acffb2937e01/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000017.png" alt="Image"/><figcaption>Time to publish a story (in minutes)</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In about 1 year we have decreased the time from an average of 33.8 minutes to 22.6 today. In this post, I am going to highlight the many changes we made.</p><h1>Adding blocks to a story</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">One of the main ways to insert anything else than text is to use what we call &#x27;<em>the plus menu</em>&#x27; which is a lot of CMS/content editing platforms perhaps like Notion.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We noticed through qualitative and quantitative feedback that some of our customers didn&#x27;t know that there is a [+] menu in the first place. That&#x27;s why we improved the empty state and added a tooltip and improved copy to encourage customers to try it.</p><img src="https://cdn.uc.assets.prezly.com/671d5cff-44c0-4ec8-a397-e9624df64929/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Empty state</figcaption><h1>The [+] plus menu</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The menu is a powerful tool to mix text with any of the other blocks that are available in Prezly like galleries, videos, file attachments or regular embeds.</p><img src="https://cdn.uc.assets.prezly.com/e40212b1-49e7-412e-b1a0-d08930b0f5b5/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000018.png" alt="Image"/><figcaption>Different variations of the [+] plus menu</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We looked at 100s of sessions of how people were using the + menu and made a lot of small/improvements:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Improved positioning of the menu on different viewports or when scrolling</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Better (fuzzy) search</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Support alternative keywords (aliases) for blocks. Searching &#x27;<em>youtube</em>&#x27; will find the video block</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Added a suggestions menu with the most used/important blocks</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Smarter positioning of the flyout menu (when scrolling). See below.</span></li></ul><h1>In-between content</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Once you have a story with some content you might want to add some multimedia in the middle. One of the challenges is that the + menu icon only shows up on an empty paragraph. And to add an empty paragraph you need to move your cursor to the beginning or end of a paragraph and hit <em>enter</em>.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This works if it&#x27;s a paragraph but becomes annoying if you want to add a block between two other blocks and even impossible if the first element in the story is a multi-media block 😱.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Initially, we wanted to solve this with icons that allow you to create an empty paragraph before/after similar <a class="prezly-slate-link" href="https://ckeditor.com/ckeditor-5/demo/" target="_blank" rel="noreferrer">to how CKEditor is solving it.</a></p><a href="https://ckeditor.com/ckeditor-5/demo/#balloon"><img src="https://cdn.uc.assets.prezly.com/5fdb468e-d1fe-4cf3-9f68-c22242f2e305/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000019.png" alt="Image"/><figcaption>CKEditor - Insert before/after</figcaption></a><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But the prototype we built came with some challenges and looked messy with the existing options/block menu we already have. </p><img src="https://cdn.uc.assets.prezly.com/e5d8f2e8-58d5-4e04-b041-559783236293/-/format/auto/CleanShot%202022-03-07%20at%2015.39.55.gif" alt="Image"/><figcaption> </figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We landed on some virtual whitespace before/after a block that can be used to insert a new paragraph. </p><img src="https://cdn.uc.assets.prezly.com/305ad2fb-d46a-4203-8249-80a64d2bf267/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000012.gif" alt="Image"/><figcaption>Insert before/after</figcaption><h2>Keyboard Shortcuts</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In addition to a workflow that involves touching your mouse we also added support for keyboard shortcuts:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Ctrl + Enter</strong> (<strong>Cmd + Enter </strong>on<strong> 🍏</strong>) to insert <em>below</em> the current block</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Ctrl + Shift + Enter</strong> (<strong>Cmd + Shift </strong>on<strong> 🍏</strong>) to insert <em>above</em> the current block</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The goal is to add additional keyboard shortcuts for common-used actions like inserting a video, linking the selected text, etc...</p><h1>Component Controls + Placeholders</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We cleaned up the UI of the component controls and made them dark. There was a lot of discussion around the dark UI but the main idea that ended up making it was that this way it contrasts with the rest of the editing experience highlighting that the dark menus are extra things/settings you can do with every editor block.</p><img src="https://cdn.uc.assets.prezly.com/a9d5558c-4dff-44c6-9f71-b3db338c0699/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000015.png" alt="Image"/><figcaption>(dark) UI of the different editor components</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">With that, we also touched the text menu and the campaign composer menu to all be dark and provide a consistent editing experience.</p><img src="https://cdn.uc.assets.prezly.com/2853cda7-5834-431a-ab8a-168ace3e2b65/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000016.png" alt="Image"/><figcaption>(dark) text formatting menu</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Additionally, we made the behaviour to add blocks more consistent where every time you want to insert a block we add a &#x27;placeholder&#x27; in the editor. This placeholder can be used to provide more guidance/help links and implement some draggable zones where an image (or multiple images) can be dragged on top of the placeholder.</p><h1>Pick a site before you start</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Because Prezly supports multiple sites it&#x27;s important to know in which space you are currently editing, because some settings and editing options are tied to the context. </p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">The available languages/translations are linked to the newsroom settings and defaults</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Newsroom contacts (think Author cards) are tied to the context of the newsroom</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Preview URLs are different</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For any customer that had more than one space, we had some magic/hard-to-explain rules and combinations that guessed the site you wanted to create this story in. The problem was that sometimes we guessed wrong which made the editing experience much harder than it should be.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;d see editors trying to change the language of their story, or insert a contact card that wasn&#x27;t there. All because we picked the wrong site.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The decision to solve this was quite simple:</p><h2><strong>1) Pick your newsroom</strong></h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The idea is to add a little friction to the flow to create a new story but avoid some headaches down the line. </p><img src="https://cdn.uc.assets.prezly.com/d0f0695b-fd55-4658-9f51-f759a16c13df/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Pick a site before creating</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Obviously, customers with only one site don&#x27;t see this picker.</p><h2><strong>2) Show which space you&#x27;re in</strong></h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Instead of having a super-weird UX pattern where one dropdown (site dropdown) would serve as both a breadcrumb and a &#x27;change your newsroom&#x27; flow was utterly confusing.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So we moved the &#x27;change newsroom&#x27; to an advanced settings pane and made the site indicator prominent and read-only so there is no more confusion as to which space you&#x27;re editing in.</p><img src="https://cdn.uc.assets.prezly.com/09b87df9-77f1-4e42-a0a9-81fc5a5827af/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Site breadcrumb (when editing story)</figcaption><h1>Image Uploader</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Behind the scenes, we&#x27;re using <a class="prezly-slate-link" href="http://uploadcare.com" target="_blank" rel="noreferrer">uploadcare.com</a> for all uploads like attachments, videos, media galleries and pictures. This is a tremendous help as they provide uploading tools but make it easy to transform and serve those assets through their CDN. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We have a deep integration of Uploadcare within Prezly but the most noticable integration for our customers is the upload modal.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><img src="https://cdn.uc.assets.prezly.com/76e39d83-7454-42ec-88ea-c10c13590a06/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Upload Modal</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So we looked at a lot of sessions where people were using this modal and came up with a list of improvements:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Improve copy of the different tabs + text</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Provide quick access to help docs</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Allow reordering image galleries during upload</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Implement a &#x27;recently uploaded&#x27; tab to avoid having to upload the same asset</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Shortcuts to set the image description based on the file name</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Bring the UI closer to our design system</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Add a &#x27;newsroom media&#x27; tab enabling editors to pick content from their site media kit</span></li></ul><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;re not done yet. But between now and my previous post on building an editor-friendly writing experience we&#x27;ve made good progress.</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Auto-save to avoid losing work</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Awesome linking experience</span><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Easily link to other content in the same CMS</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Allow different type of links</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Highlight (and upgrade) broken links</span></li></ul></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Use good typography</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Great support for lists</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Show pasted images inline</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Essential features done right</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Wrap long lines</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Make it fast (speed/performance)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Support text-correction extensions</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Undo/Redo (with shortcuts)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Good pasting behaviour</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;re currently working on a new interface for Story editing that goes beyond the Prezly editor (Snowbird). This will hopefully address most of the issues I listed <a class="prezly-slate-link" href="https://www.lifelog.be/redesigning-the-writing--publishing-experience-tcdet7" target="_blank" rel="noreferrer">in this previous post.</a></p><div style="background:#FEE;border:1px solid red;color:red;padding:1em;margin:1em 0"><strong>[@prezly/content-renderer-react-js]</strong> Unknown node type encountered:<div style="font-family:monospace">{&quot;type&quot;: &quot;story-bookmark&quot;, &quot;children&quot;: [...], &quot;uuid&quot;: &quot;77679d6f-d91f-4d2d-a956-99c8e9d09d8d&quot;, &quot;story&quot;: {&quot;uuid&quot;:&quot;6e477dba-3bca-4243-8db9-73b5b6d93cbd&quot;}, &quot;show_thumbnail&quot;: true, &quot;layout&quot;: &quot;horizontal&quot;, &quot;new_tab&quot;: false}</div></div><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Are there any improvements you&#x27;d like to see? </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/building-an-editor-decreasing-the-time-to-publish-by-44</link><guid isPermaLink="true">undefined/building-an-editor-decreasing-the-time-to-publish-by-44</guid><pubDate>Mon, 17 Oct 2022 08:54:00 GMT</pubDate></item><item><title><![CDATA[Redesigning the writing & publishing experience]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/88a7192d-ef7f-4c5b-8921-120786942254/-/format/auto/new-button.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/4a5a82c4-9055-4c59-b1b4-321504575f7b/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/bd800a38-294a-4bfe-8625-f2ec88eaf50e/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/ad50f44f-18ab-436f-8987-d6a866b90762/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/c0a02e1b-fdc9-486d-bad9-826136c3ffa8/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/5237e87d-9bf5-431f-b574-1359747e78d3/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/f0412fc1-22fa-4e11-9afc-326d089c9055/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/4f812949-e7d4-421f-b3d8-89a78d9589f4/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/17aea632-9ca5-45ae-b382-2e0f688ad227/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2>The interface in which I am writing this blog post is over 5 years old and has UX issues. A quick write-up of what we&#x27;re thinking about and what we are struggling with.</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This project can be broken up in three different components:</p><ol class="prezly-slate-list prezly-slate-list--numbered prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">The writing experience / Editor itself</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">CMS / The story editing interface</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">The publication flow</span></li></ol><h2>The editing experience</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Turns out that building a good editor in 2022 is not as easy as it sounds. While Google Docs, Dropbox Paper, Notion and Coda have their own proprietary solutions there is nothing out there that comes close to that level of quality.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In our research, when it comes to open-source projects, there is only really <a class="prezly-slate-link" href="https://www.slatejs.org/examples/richtext" target="_self">SlateJs</a> (24k stars) and <a class="prezly-slate-link" href="https://tiptap.dev/" target="_self">TipTap</a> (14k stars) worth considering to build an experience on.</p><p><a href="https://twitter.com/digitalbase/status/1400440530610315271">Gijs Nelissen on Twitter</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I&#x27;ve wrote about this in a previous blog post:</p><p><a href="https://www.lifelog.be/create-an-editing-experience-people-love">Create an editing experience people love</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;ve been investing in <a class="prezly-slate-link" href="https://github.com/prezly/slate" target="_self">our version of slate editor</a> and we&#x27;ve come a long way including keyboard shortcuts, a new + menu, embeds/website bookmark, auto-formatting/detection and improved text-alignment.</p><img src="https://cdn.uc.assets.prezly.com/88a7192d-ef7f-4c5b-8921-120786942254/-/format/auto/new-button.gif" alt="Image"/><figcaption>Check out the + menu or inserting bookmark functionality</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We still have long way to go but a solid plan how to get there. Short/mid term improvements include:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">better linking (link to internal references)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">improve the support for pasting from GDocs, PDF, ...</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">placeholder components</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">drag-dropping components</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">more customisation on sizing/alignment of galleries</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Most best practices can be borrowed from popular editors like Coda, Google Docs, Notion and even Microsoft Word. Oh, did you know the most requested editor feature is text-justification (for the web)! 🤯</p><h2>CMS / The story editing interface</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Turns out that this is a much harder problem to solve. Here is an overview of the story editing interface for a multilingual story with 2 translations in an account that has multiple newsrooms.</p><img src="https://cdn.uc.assets.prezly.com/4a5a82c4-9055-4c59-b1b4-321504575f7b/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Current Editing interface - two languages and multiple newsrooms</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Although we do not have any major complaints (it&#x27;s been in use for over 5 years) and is being used 1000x per day with over 300k stories published I feel there is a lot of room for improvement.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Some of the issues we might want to address:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">The left sidebar draws a lot of attention taking away attention from the content</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Language settings everywhere. The sidebar has a language switcher while translations and switching translations happens in the &#x27;manage&#x27; dropdown</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Publication settings like visibility and publication date are in the left sidebar but the flow to finally publish a story is in the right top corner</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Newsroom picker is a setting but was lifted as some kind of super setting. On other pages it acts as a filter/navigation but on this page it&#x27;s a setting</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">General page canvas. The combination of the sidebar, sub-navigation and manage tab makes the interface overwhelming</span></li></ul><h2>The publication flow</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In today&#x27;s interface the publication flow is mixed in with the rest of the settings and the writing interface. And because some of the settings (scheduling, embargo, private story) affect the publishing behaviour this comes with some confusion.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">To work around this we have introduced a &#x27;great job publishing&#x27; success modal together with dynamic labels on the main publish button.</p><img src="https://cdn.uc.assets.prezly.com/bd800a38-294a-4bfe-8625-f2ec88eaf50e/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Indicating what to expect</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The more we work on the story edit and gather more information through desk research and customer interviews the more we are realizing that it might be better to break up the publication flow all together.</p><h1>We&#x27;re stuck</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">At this point I feel we&#x27;re stuck. We&#x27;ve looked at all our competitors, the best CMS systems out there and have browsed the web for inspiration.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">It feels like we&#x27;ve dug our hole too deep and are trying to solve too many things at the same time. Please send help!</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Here is a list of assets/attempts (please note that these are just random picks from a larger project including low fidelity wireframes or idea sketches)</p><img src="https://cdn.uc.assets.prezly.com/ad50f44f-18ab-436f-8987-d6a866b90762/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Accordeon</figcaption><img src="https://cdn.uc.assets.prezly.com/c0a02e1b-fdc9-486d-bad9-826136c3ffa8/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Coda Style Accordeon</figcaption><img src="https://cdn.uc.assets.prezly.com/5237e87d-9bf5-431f-b574-1359747e78d3/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Icon Based Navigation panel</figcaption><img src="https://cdn.uc.assets.prezly.com/f0412fc1-22fa-4e11-9afc-326d089c9055/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Fixed menu - Toggle Right</figcaption><img src="https://cdn.uc.assets.prezly.com/4f812949-e7d4-421f-b3d8-89a78d9589f4/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Different variations of the sidebar</figcaption><img src="https://cdn.uc.assets.prezly.com/17aea632-9ca5-45ae-b382-2e0f688ad227/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>More sidebar variations</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/redesigning-the-writing--publishing-experience-tcdet7</link><guid isPermaLink="true">undefined/redesigning-the-writing--publishing-experience-tcdet7</guid><pubDate>Thu, 10 Feb 2022 17:59:00 GMT</pubDate></item><item><title><![CDATA[Create an editing experience people love]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/b0445a6e-b5d0-4c2b-9439-8a701a65bec9/-/format/auto/adding_link.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/44ce61ae-41e3-480a-adac-4746bea8059c/-/format/auto/link_to_content.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/c32faea1-ade2-4b9d-a99d-3c8d46a8108e/-/format/auto/editor_medium.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/39dd18d9-ffe6-4b4b-bc0a-4323e196e080/-/format/auto/linear_text_image_text.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/04810ee8-f974-433a-83d4-1f9e272361bb/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Text editors are central to most online apps. While text editors used to be important for Content Management Systems (CMS), they are now an important part of many more tools such as Project Management Systems and CRM systems. Customers are rightfully more demanding when it comes to how they create content.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><strong>But building a good editor is bloody hard</strong>. You&#x27;d expect that this is a solved problem in 2021 yet so many products have a poor writing experience. As a result, content is written off-line, using tools like Google Docs, Microsoft Word or a notes app and then pasted in an inferior editor.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This is a post listing some recommendations for creating a more friendly web-based writing experience:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#auto-save-to-prevent-lost-work" target="_self">Auto-save to avoid losing work</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#awesome-linking-experience" target="_self">Awesome linking experience</a></span><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#easily-link-to-content-in-same-cms" target="_self">Easily link to other content in the same CMS</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#allow-different-types-of-links" target="_self">Allow different type of links</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#highlight-and-upgrade-broken-links" target="_self">Highlight (and upgrade) broken links</a></span></li></ul></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#use-good-typography" target="_self">Use good typography</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#great-support-for-lists" target="_self">Great support for lists</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#show-pasted-images-inline" target="_self">Show pasted images inline</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#essential-features-done-right" target="_self">Essential features done right</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#wrap-long-lines" target="_self">Wrap long lines</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#make-it-fast" target="_self">Make it fast (speed/performance)</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#support-text-correction-extensions" target="_self">Support text-correction extensions</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#undoredo-with-shortcuts" target="_self">Undo/Redo (with shortcuts)</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#good-pasting-behaviour" target="_self">Good pasting behaviour</a></span></li></ul><hr class="prezly-slate-divider"/><h1>Auto-Save to prevent lost work</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">If we want to get people away from the &#x27;traditional&#x27; editors we need to protect people from losing their work. No internet connection when you hit save? Browser crash?</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I can guarantee you that the author will never use your editor the same way ever again if they lost an hour of their work.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Online editors should invest in techniques to make sure this does not happen, the technology is out there. Some ideas:</p><ol class="prezly-slate-list prezly-slate-list--numbered prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Browser Local Storage (client-side)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Auto-saving in the background (server-side)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Versioning content (server-side)</span></li></ol><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Option #2 is the option most web apps will pursue but for CMS systems that allow publishing content, it comes with another challenge which is to know which content has been published which is where option #2 comes in.</p><h1>Awesome linking experience</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Most WYSIWYG editors have ported the Microsoft word linking behaviour to their online counterparts. We&#x27;re so used to applying a link to an element:</p><img src="https://cdn.uc.assets.prezly.com/b0445a6e-b5d0-4c2b-9439-8a701a65bec9/-/format/auto/adding_link.gif" alt="Image"/><figcaption>Adding link in gmail</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This is a missed opportunity with two big area&#x27;s of improvement:</p><h2>Easily link to content in same CMS</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Most blog posts refer to previous posts or paragraphs. Forcing editors to visit their blog, find the URL/anchor and paste it as a link is such a waste of time.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">A few exceptions (Google Docs, Notion) are helping writers to browse/search for other content but I&#x27;m disappointed every time I have to open a new tab to find the URL for something I want to link.</p><img src="https://cdn.uc.assets.prezly.com/44ce61ae-41e3-480a-adac-4746bea8059c/-/format/auto/link_to_content.gif" alt="Image"/><figcaption>Notion helps with linking to other pages</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">ℹ ​ Bonus points for the ability to link to anchors which I think only Google Docs can do (only within the same document).</p><h2>Allow different types of links</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">A link used to be a few underlined words pointing to an external page. In 2021 there are so many more ways to present links (cards, embeds).</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Editors could help with &#x27;upgrading&#x27; links to an embed or card. Preferably the editor has the ability to specify how the link is displayed.</p><h2>Highlight (and upgrade) broken links</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The web is filled with broken links 😵 Make sure the editor indicates broken links by checking the page in the background and hinting at the status (status code).</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">While you&#x27;re at it how about improving/fixing the link? If the server replies with a 302 redirect (for example from http:// to https://) update the link without asking the editor. It does make the web a better place!</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">ℹ ​ Personally, I prefer not to see the schema in any link. If a user pastes https://www.lifelog.be in your editor you&#x27;d like to see it auto-link that phrase to the webpage and at the same time change the link text (or label) to www.lifelog.be.</p><h1>Use good typography</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Many online editors use weird fonts and font sizes. ​ No content creator is going to spend an hour writing content in an editor that makes them squint.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Readability is a big problem on the web with <a class="prezly-slate-link" href="https://usability.yale.edu/web-accessibility/articles/readability" target="_self">many</a> <a class="prezly-slate-link" href="https://readable.com/" target="_self">initiatives</a> and <a class="prezly-slate-link" href="https://www.smashingmagazine.com/2009/03/10-principles-for-readable-web-typography/" target="_self">resources</a> to solve that. Learn about the best practices in those projects and apply them to your editor.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The example to follow here is Medium.com where the editing experience equals the reading experience. </p><img src="https://cdn.uc.assets.prezly.com/c32faea1-ade2-4b9d-a99d-3c8d46a8108e/-/format/auto/editor_medium.gif" alt="Image"/><figcaption>Editing in medium.com is like reading</figcaption><h1>Great support for lists</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">People use lists. A lot. Make sure your editor has good support for it. A list 😎of suggestions:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">support hitting tab to indent lists</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">auto-detect lists once a person starts a few (or one line) with -</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">allow nested lists</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">shift+tab should decrease indenting</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">think about how people &#x27;exit&#x27; the list (enter+enter?)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">allow people to convert lists from bullets into numbers</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Writing this piece in Bear reminds me how important the support for lists really is.</p><h1>Show pasted images inline</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">While initially, only some editors allowed you to attach images to your posts it&#x27;s 2021. People do text -&gt; image -&gt; text. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Regardless if one is writing an article on a blogging platform, sharing feedback on a design in a project management platform or updating an internal document in your intranet please support pasting images!</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The ideal flow is that while writing the text you can just hit paste to add an image from the clipboard. Please don&#x27;t attach it at the bottom of the post (I&#x27;m not drafting an email) but add it wherever the cursor is.</p><img src="https://cdn.uc.assets.prezly.com/39dd18d9-ffe6-4b4b-bc0a-4323e196e080/-/format/auto/linear_text_image_text.gif" alt="Image"/><figcaption>Pasting an image in a Linear comment</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">ℹ ​ Bonus points for auto-sizing/optimising the image or allowing controls for the editor to size/align the image</p><h1>Essential Features done right</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">All the power features you have added to your editor (image wrapping, code editing, advanced text styles or colour picker) do not mean anything if you have not nailed the basics.</p><img src="https://cdn.uc.assets.prezly.com/04810ee8-f974-433a-83d4-1f9e272361bb/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption> </figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Seriously, I don&#x27;t need font colours or backgrounds if I can&#x27;t paste an image inline. Start with the basics before you spend time on the advanced stuff. </p><h1>Wrap long lines</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">There has been <a class="prezly-slate-link" href="https://baymard.com/blog/line-length-readability" target="_self">plenty</a> <a class="prezly-slate-link" href="https://www.amazon.com/Elements-Typographic-Style-Robert-Bringhurst/dp/0881792063/&amp;tag=jounce-20" target="_self">of</a> <a class="prezly-slate-link" href="https://www.smashingmagazine.com/2014/09/balancing-line-length-font-size-responsive-web-design/" target="_self">research</a> that a line longer than 70 characters is hard to read. While this rule is well known in web readability it&#x27;s often ignored in editing experiences.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This problem is even more noticeable with full-width (focus mode) text experiences. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Use max-width in combination with optimised font size/typography for an editing experience that has good readability. It really does wonders.</p><h1>Make it fast</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This should not even be here but I&#x27;m adding it anyway. If your editor is clogging up my browser window (I&#x27;m looking at you Confluence) you&#x27;ll never convince me to use your editor to do the writing.</p><p><a href="https://twitter.com/youyuxi/status/1377239367211700228">Evan You on Twitter</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Spend time on performance! <a class="prezly-slate-link" href="https://twitter.com/sarthakgh/status/1365295526678265856" target="_self">Some people will take 1/10 of the features for 10x the speed</a>.</p><h1>Support text-correction extensions</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">How long did it take for <a class="prezly-slate-link" href="https://support.grammarly.com/hc/en-us/articles/115000090991-Does-Grammarly-support-Google-Docs-#:~:text=If%20you%20use%20Chrome%20as,Grammarly%20sidebar%20in%20Google%20Docs.&amp;text=To%20access%20Grammarly&#x27;s%20suggestions%2C%20open,corner%20of%20the%20browser%20window." target="_self">google docs to support Grammarly</a>?</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">There are so many good correction engines (Grammarly, slick write) out there that provide browser extensions to make sure the text correction can be done wherever you write. Surprisingly not all editors support those extensions forcing you to copy/paste your text into Grammarly just to do text corrections 🤯</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Also, please don&#x27;t try to build text correction yourself (maybe unless you are Google) but allow existing solutions to hook into yours.</p><h1>Undo/Redo (with shortcuts)</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For me undo/redo is <a class="prezly-slate-link" href="http://www.mattduck.com/undo-redo-text-editors.html" target="_self">a solved problem</a> and much expected in any content editor. Surprisingly there are editors that do not support undoing.</p><h1>Good pasting behaviour</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Following the suggestions in this post is not a guarantee that people will stop pasting stuff. Spend time on figuring out what/how they are pasting and make sure it works well. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In our case, we triggered a survey the first time we detected a paste from an unknown source (weird formatting or elements). In that survey, we asked the user where they were pasting from and questions around why they didn&#x27;t write in Prezly in the first place.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Results of this survey were then used to help us figure out which pasting behaviour (from which source) we needed to prioritise.</p><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Word has been around for a long time. It&#x27;s unlikely that the tips in this post would mean people trust your editor to be 1:1 alternative. Like it or not, MS Word will continue to be an enormous force behind the content that finds its way online.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">However, it&#x27;s also true that a lot of online editors <u>are super annoying to content authors</u>. While some platforms have a great tech stack and are growing rapidly they oftentimes have poor experience for long writing sessions. So it&#x27;s little surprise authors actively avoid them to perform their writing.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Maybe this post is one step in the right direction</p></section></div>]]></description><link>undefined/create-an-editing-experience-people-love</link><guid isPermaLink="true">undefined/create-an-editing-experience-people-love</guid><pubDate>Wed, 02 Jun 2021 15:27:00 GMT</pubDate></item><item><title><![CDATA[How I built this blog]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/5238e523-4c7e-43ee-a75d-1c2583a713b2/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/8848de10-4e01-40c4-8d3f-877658f34657/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/6fbd15b1-9bd2-439e-a03b-6a581e34b172/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/a4a1d679-7445-4db3-a5ff-4c616c72159f/-/resize/1200/-/format/auto/Untitled.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/3cf98759-8f87-4ecd-a1fe-59b32ee8432e/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/f3360c35-de27-4c19-a40a-a1b5fb50946b/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In this article, I am going to break down how this blog works. When I started this project my main requirements were 1) developer experience, 2) performance and 3) simplicity.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><strong>Update July 2022: </strong><a class="prezly-slate-link" href="https://www.lifelog.be/new-blog-theme" target="_blank" rel="noreferrer"><strong>New blog theme</strong></a></p><h2>The stack</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This blog is a <a class="prezly-slate-link" href="https://nextjs.org/" target="_self">Next.js</a> application that is pulling in content from the Prezly CMS. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Using Next, <a class="prezly-slate-link" href="https://nextjs.org/docs/basic-features/pages#two-forms-of-pre-rendering" target="_self">you have a few options</a> when it comes to page rendering: “on-demand” (server-side rendering) or ahead of time (static site generation). I&#x27;ve opted to build all the pages posts ahead of time when the site is generated (so on every deployment).</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The site is deployed on <a class="prezly-slate-link" href="https://vercel.com/" target="_self">Vercel</a> (the company behind Next). The developer experience is awesome where it auto deploys the blog on every commit/merge to main.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><img src="https://cdn.uc.assets.prezly.com/5238e523-4c7e-43ee-a75d-1c2583a713b2/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Vercel Dashboard</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For analytics I decided to use <a class="prezly-slate-link" href="https://plausible.io/" target="_self">Plausible Analytics</a> which took me 3 lines of code to set-up:</p><h2>Content/CMS/Deployment</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This all started as a big experiment while I was trying to figure out what we needed to do <a class="prezly-slate-link" href="https://www.prezly.com/news/announcing-open-newsroom-themes" target="_self">to make Prezly more developer-friendly</a>. By trying to power an (external) blog with content written within the Prezly editor it would allow me to identify the parts of the chain that need more attention.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Every time I create or write a story in Prezly it triggers a Vercel webhook which in its turn generates+deploys the site. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><img src="https://cdn.uc.assets.prezly.com/8848de10-4e01-40c4-8d3f-877658f34657/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Edit -&gt; Webhook -&gt; Deploy</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Because of the limited number of blog posts the rebuild takes less than a minute:</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><img src="https://cdn.uc.assets.prezly.com/6fbd15b1-9bd2-439e-a03b-6a581e34b172/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Building blog (51 seconds)</figcaption><h2>Story Renderer</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The Prezly editor stores content in a rich text format (and not HTML). This is a common practice in today&#x27;s Content Management Systems as this allows for more flexibility when it comes to the rendering and management of that content. There <a class="prezly-slate-link" href="https://github.com/bustle/mobiledoc-kit/blob/master/MOBILEDOC.md" target="_self">is even a standard for it.</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><a class="prezly-slate-link" href="https://arpitonline.com/2018/12/10/on-rich-text-editors/" target="_self">Here is a great article</a> (2018) about the benefit of rich content types.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p><a href="https://arpitonline.com/2018/12/10/on-rich-text-editors/">On Rich Text Editors</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In Prezly&#x27;s case, it means that content you write in a SlateJS powered editor is stored as a JSON object in our data store. That raw content object is fetchable through the API and we provide a renderer to then turn it into HTML.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So take this example content in Prezly:</p><img src="https://cdn.uc.assets.prezly.com/a4a1d679-7445-4db3-a5ff-4c616c72159f/-/resize/1200/-/format/auto/Untitled.png" alt="Image"/><figcaption>Example content (email campaign in Prezly)</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The content (starting from hi %contact.firstname%) will be stored JSON:</p><p><a href="https://gist.github.com/digitalbase/116cb697b2a1b1dceec302230d23036d">Github Gist: <!-- -->Example email campaign (slateJS)</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">As we&#x27;re using <a class="prezly-slate-link" href="https://docs.slatejs.org/" target="_self">SlateJS</a> as an editor you can read more about <a class="prezly-slate-link" href="https://docs.slatejs.org/concepts/02-nodes" target="_self">the content structure</a> (not mobile doc) in their help article. Using the <a class="prezly-slate-link" href="https://www.npmjs.com/package/@prezly/slate-renderer" target="_self">Prezly provided slate renderer</a> the code that turns this JSON object into the HTML you are reading right now looks like this:</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">https://github.com/digitalbase/lifelog.be/blob/main/components/Article/Article.tsx#L36-L40</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">How content is rendered can be customised by feeding options into the renderer which I had to use to display code snippets (see below).</p><h2>Other Pages</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For other pages such as the home page, the list of blog posts and sitemap I used the Prezly Node SDK to do some very simple API fetching.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For example, the home page that lists the latest 3 articles (<a class="prezly-slate-link" href="https://github.com/digitalbase/lifelog.be/blob/main/pages/index.tsx" target="_self">source code</a>):</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">https://github.com/digitalbase/lifelog.be/blob/main/pages/index.tsx#L32-L42</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Which by itself is just a simple wrapper to list content</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">https://github.com/digitalbase/lifelog.be/blob/fbb7d1d2fb56f0f2369b50e4606f975fbf49243a/src/providers/prezly.ts#L40-L63</p><h2>Embedding Code Snippets</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The Prezly supports embeds by making use of <a class="prezly-slate-link" href="https://iframely.com/" target="_self">Iframely</a> which natively supports github embeds (see JSON sample above). But if you have a lot of code to show off copy-pasting code into secret Github gists is cumbersome. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So I wanted to be able to show off code in a github repo or branch and Googling a solution for this got me to emgithub.com which looks to be exactly what I wanted.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Integrating the embed code in within the project was pretty clunky (dangerouslySetInnerHtml, embed.js being calls numberous times, ...) so decided to extract the code. Actually, <a class="prezly-slate-link" href="https://github.com/digitalbase/lifelog.be/pulls?q=is%3Apr+is%3Aclosed" target="_self">my colleague did it for me</a>.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">https://github.com/digitalbase/lifelog.be/blob/main/components/GithubSnippet/GithubSnippet.tsx</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So what the code is doing:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">fetching the raw github code (client side) using https://raw.githubusercontent.com</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">use &#x27;<a class="prezly-slate-link" href="https://github.com/react-syntax-highlighter/react-syntax-highlighter" target="_self">react-syntax-highlighter</a>&#x27; to show a code pane</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">add &#x27;view raw&#x27; and &#x27;copy to clipboard&#x27; functionality. <a class="prezly-slate-link" href="https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript" target="_self">Stole from stackoverflow</a></span></li></ul><img src="https://cdn.uc.assets.prezly.com/3cf98759-8f87-4ecd-a1fe-59b32ee8432e/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>My browser fetching the code snippets on this page</figcaption><h2>Styling</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">When it comes to styling I think I overdid it. I decided to use <a class="prezly-slate-link" href="https://chakra-ui.com/" target="_self">ChakraUI</a> (as an experiment) but in the meanwhile I have been playing around with TailwindCSS (and more <a class="prezly-slate-link" href="https://blog.tailwindcss.com/just-in-time-the-next-generation-of-tailwind-css" target="_self">specifically with Just in Time generation</a>). Now I want to throw out ChakraUI and switch to vanilla tailwind.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">There are some upsides to using ChakraUI. For example, <a class="prezly-slate-link" href="https://github.com/digitalbase/lifelog.be/blob/main/components/Hero/Hero.tsx" target="_self">check out the source code</a> for this hero component on the homepage:</p><img src="https://cdn.uc.assets.prezly.com/f3360c35-de27-4c19-a40a-a1b5fb50946b/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Hero component on homepage</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Overall I feel using Chakra forced me to learn another syntax/way of doing things and I might be better off investing this time in properly learning TailwindCSS which can do the same stuff anyway.</p><h2>Todo list</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">A list of things I want to do with the blog</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://github.com/prezly/theme-nextjs-starter" target="_self">Use theme-starter</a> boilerplate code to fetch content</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Score better on Lighthouse Audit tools</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Allow paging from home page</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Support Search</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Implement subscribe functionality (stay updated)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Improve SEO/meta tags</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Add RSS feed (and any other feed protocols people use)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Get rid of ChakraUI</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Make better use of <a class="prezly-slate-link" href="https://uploadcare.com/" target="_self">Uploadcare.com</a> (using <a class="prezly-slate-link" href="https://www.npmjs.com/package/@prezly/uploadcare-image" target="_self">uploadcare-image</a>)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Bring back sitemap.xml</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Fetch intro text from newsroom boilerplate (make customiseable)</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/how-i-built-this-blog</link><guid isPermaLink="true">undefined/how-i-built-this-blog</guid><pubDate>Mon, 31 May 2021 12:16:00 GMT</pubDate></item></channel></rss>