The lists below give you a idea of what I’m working on. I tend to announce significant news on Blot’s Twitter account. Please don’t hesitate to contact me if you have any questions.

Enable SSL on Blot subdomains
7 minutes ago

Updated remove script
a day ago

Added script to fix ghost list
a day ago

Merged client to-do lists
a day ago

Updated fix menu script
4 days ago

Hide disqus comments on drafts
4 days ago

Pass options to build
4 days ago

Made build interface more tolerant
4 days ago

Fixed buggy reference to entry build
4 days ago

Fixed bad promise error handling
4 days ago

Updated local client
5 days ago

Updated local client
5 days ago

Watched now respects a disconnected client
6 days ago

Cleaned up local client
6 days ago

Tidied up local client
6 days ago

Improvements to local client
6 days ago

More tweaks to local client
6 days ago

Added demo local client
6 days ago

Final tweak to readme before I go and do some work
6 days ago

Readme whitespace
6 days ago

Formatting of readme
6 days ago

Updated gitignore
6 days ago

Updated app readme
6 days ago

Updated readme
6 days ago

Updated configuration readmes
6 days ago

Updated documentation for test suite
6 days ago

Updated readme
6 days ago

Updated readme
6 days ago

Updated readme
6 days ago

Handle posts without titles better
6 days ago

Allow optional slug in function which determines an imported entry's path
6 days ago

Added test for asset 404s
6 days ago

Increased timeout interval for git too
7 days ago

Updated rename check
7 days ago

Updated rename catcher
7 days ago

Handle headersSent
7 days ago

Handle headers sent
7 days ago

Increase timeout for Dropbox tests
7 days ago

Tidied up assets route
7 days ago

Added tests for asset middleware
7 days ago

Pass build errors back to main process
7 days ago

Made pandoc converter tolerant of duplicate footnoteS
7 days ago

More debugging
7 days ago

Updated rebuild script
7 days ago

Fixed double scrollbar on preview wrapper
7 days ago

Fixed reference to build
7 days ago

Fixed uninitialized variables
8 days ago

Handle www redirects better
8 days ago

Updated entry script
8 days ago

Updated script to fix entries
8 days ago

More settings page copy tweaks
10 days ago

Settings page copy
10 days ago

Tidied up app index file
11 days ago

Added comments to day one import script
11 days ago

Rebuild scripts
11 days ago

Fixed rebuild script
11 days ago

Fixed reference to build in rebuild
11 days ago

Added importer for Day One
12 days ago

More cleaning of vhosts
12 days ago

Cleaned up code style
12 days ago

Rewrote vhosts for blog
12 days ago

Tidied draft and preview code
12 days ago

Cleaed up more of build code
12 days ago

Updated build script to handle sigterm
13 days ago

Moved forking inside build
13 days ago

Renabled wordpress import features
13 days ago

Removed comment
13 days ago

Logging for build
13 days ago

Refactored child process management
13 days ago

Reorganized folder
13 days ago

To do

Translate Benjamin's ghost theme and reply back to him on Twitter

Fix John and Nash's rename bugs.

Fix Anders image path bug. A file titled "_på besøg hos gomorgen danmark.jpg" cannot be embedded in a blog post. Write test which ensures this doesn't happen again. This should also fix bug with case-sensitive paths to thumbnails + Dropbox client and tell Jan-Erik on Twitter DMs. Make resolve work more impressively, attempt to resolve a path in a case insensitive manner. Or is this a good idea? Maybe we should only resolve paths which match stored metadata? Or should we make a best-effort? As long as we are resolving case-only it should be fine... Tell Michael it now works. This should also fix bug with accents in image paths for Wesley. Incorporate retries into the thumbnail fetcher...

Fix Kevin's URL encoding bug. Each entry's url property is not encoded as a URI component on the server but it needs to be.

Work out elegant way to produce fully qualified SRCs and HREFs for blogs to help make RSS feeds work more effectively, then tell Jack, Sven, Kevin and Will about the fix, which affects people who use Also tell Michael who is hardcoding his domain. Also tell Jaco

Prevent ignored files from generating preview.html files when inside the Drafts folder. Tell Kerim

Markdown bugs

  • Fix bug with .emf files in Word Document and follow up with Todd. Can we convert EMFs? Can we pass a flag to pandoc to let them deal with it? Is this just caused by Tiff files? I need a Windows machine to test this.

  • Fix bug with double escaped embedded ampersands then tell Gavin and Ryan his

  • Fix issue with teaser generator that locks up a build process, sometimes for 10+ seconds.

  • Fix bug with pandoc's video embed feature which automatically adds the autoplay attribute when turning a raw url to a video into a video player then tell Wesley know

  • Fix bug with blockquotes and tell Kerim. Multiple ">" symbols on the blank paragraphs between other quoted text are not formatting properly.

  • Fix bug with strange windows notepad encoding

  • Let Osvaldo know

  • Fix bug with indented code in pre tags and tell Michael

Metadata bugs

  • Fix permalink issue with periods and tell Farzain

  • Add support for YAML-style custom metadata and tell Shibel and Casey

  • Fix bug generating summary when title metadata is set and tell Amit

  • Fix encoding bug with greek URLs then tell Rodericus know

  • Fix bug with how the date parser. It doesn't handles a space (or lack of space) between the date and the time. For example, '2017-08-27 18:16:59' works but '2017-08-27-18:16:59' doesn't

  • Fix bug parsing ISO8601 date format and tell Thomas

  • Fix bug in metadata parser which gets tripped by a URL on the first line of the file then tell Jan, Pete and Kim know

  • Fix bug with case sensitivity for tag folders. Need to recursively check all directories for proper case when extracting tags then tell Thomas


Add way to archive existing template

Add way to rename existing template

Move to uuid based template IDs instead of slug

Ask to confirm, but remove files from blog folder when disabling local editing

How do we share info, like a link on a menu, or a header image across themes? Could there be a shared info repository that themes could access?

How do we transition from a global menu to one that the themes have control over? How do we share existing links between themes? How do we deal with the order of pages in a user's folder?

How do we transition from a global date display format to one that themes have control over?

Change url?json=true to debug=true?

Add export to zip and import to zip feature for themes

Port the jekyll theme Neocactus to Blot and document the process then tell Robert

Finish Ghost theme import for Kingi


Fix bug with theme editor which prevents you from setting the route of a new view. You need to set it, then reset it for the route to work as expected.

Fix bug with title and partials in local editing
  - Tell [Luke](
  - Tell [Frank](

Fix bug with cache not busting for static rendered themes:
1. put posts in blog
2. sync, create view e.g. static.js which renders all_entries
3. remove posts from blog
4. reload page, static.js still shows the entries, which archives.html does not

Grid theme

  • Find good source of material
  • Release the theme

    Magazine theme

  • Fix bug with Barba.js which is not working
  • Add fade in out transitions
  • Ensure titleless blog posts work
  • Improve the about page
  • Add grey bg to loading thumbnails

    Portfolio theme

  • Follow up with Laura Good source for theme content:

    Improve the selection of themes

  • Don't modify any code, just design themes
  • Build script to archive a particular theme
  • Nice Jekyll theme:
  • Draw simple abstract representations of each theme for the themes page to replace thumbnails
  • Let Chris, Nash and John know about new themes


  • Install and test a few of these static site generators:
  • Make themes file or folder based
  • Consider making file-based theme directory a git repo and using this to implement basic undo-redo functionality.
  • Disable re-rendering for theme locals
  • Add better customization options
  • Local theme editing does not clear cache
  • Use Hogan for precompiling and rendering themes?
  • Let Aurynn know when it's possible to set routes locally
  • Let Brian know when it's possible to set variables locally
  • Let Jason know when you can use tokens in routes
  • Add way to allow all entry lists to access {{#months}} sorting options just like the archives page.
  • Fix Frank's strange theme bug
  • Warn users that underscore will not work for hidden pages
  • Fix _ entries to true public files, tell john & other folks who depend on the menu: yes, page: no side effect
  • Tell Rodrigo don't write previews for _ posts
  • Add support for fetching only some properties of an entry (ideally only those that are used). prevent some properties from being fetched in some lists (html, for example in all_entries). Would be a good candidate for hgetall or hget?

Increase price for new customers to $30 a year. This will not affect existing customers.

Record a new demo video

  • Show sites I run using Blot
  • "Bring your own interface"
    • show demo of simple custom text editor built in electron or something which has autocomplete tags, drag and drop images, explain that you can build something like this yourself.
  • Blot's developer blog, a conventional blog, show using different text editors
  • My visual scrapbook: shows tag folders, photo blog
  • My link blog: shows the webloc feature, shows IFFFT, perhaps from favourited tweets?
  • My personal site: simple landing page, edit with a doc file?

Move to using unix socket with redis client per documentation for better throughput. Read this issue first, I might need to make some user group permissions tweaks to ensure things are secure.

Increase default quality for sharp's output images

Re-enable image minifier and fix the bugs it creates

Can we keep the pandoc child_process running and pipe stuff in and out for speed? Measure before after to ensure this helps

Generate screenshots as thumbnails for webloc posts

Implement LE wildcart SSL certificate support

Self-hosting documentation

Move to Linode

Make dashboard requests idempotent to prevent multiple form resubmits, multiple new blogs created accidentally?

Prune package.json To minify HTML To minify CSS To minify JavaScript

Perhaps just cluster the main process? How will I verify that there is not statefullness somewhere in the server? I also want the main 'server' running on different threads to the CPU intensive stuff like image processing. Will this fix the bug with additional child processes if main process runs out of memory? Something wasn't being killed during the Nash WAV bug of August, 2018. There were duplicate node rebuild processes running.

Ensure the nginx service can be controlled properly using Upstart. It seems like Monit's attempts to reboot the service which failed, caused the downtime. Potentially worth reviewing commands in this:

Distribute static built blogs on dat

Use this redis analysis tool to see if I can squeeze more out of REDIS

Add an EXPIRY to the log entries for a blog's 404 log

Follow up with Christian about DataValet blocking

Client.write does not propogate sync errors... to demonstrate this, revoke dropbox token then try to enable local editing.

Look into mirroring site across multiple domains and follow up with Thomas

Move to cool user subdomains

  • Pretty to proper blog IDs instead of integers

Public site

  • Log 404s on the public site to identify neccessary redirects
  • Personalize the documentation for logged in users
  • Add a resource page to the documentation with guides like this:
  • Inline all CSS for performance
  • Render the formatting guide navigation on the server

Developer documentation

  • Make reference page searchable
  • Add types and examples to items on reference page
  • Work how to explain the archives property

Investigate static site search offerings

  • It would be nice to have one whose index you could build on the server, and deliver statically, perhaps even chunked if it was huge
  • Would be nice to be able to patch updates to this index quickly without rebuilding the whole thing


  • Dumb quotes are still smartified, even without typeset enabled.
  • Tolerate missing 'www' in personal domain field on dashboard for users with a custom domain when checking validity
  • Can we trim the homepage to get to this?

    • Title ____
    • Domain | Your folder |
    • Theme | |
    • Photo | |
    • URLs |__|
    • Dates

    Menu, Dates, Disqus, Analytics etc. would be customized per theme Services page would be phased out, perhaps introducing metadata flags, e.g. Typeset: no Katex: no Or global flags in something like config.json. Would be rare though. Client would be a link at the bottom corner of the folder. Synced by Dropbox (edit)

  • Generate SSL cert for www subdomain of apex domain pointed to Blot, and redirect it to apex domain. Tell Paul

  • Implement a flags page for toggling all the settings (including hidden ones) for a given blog
  • Route requests to new dashboard if toggle is on to allow thorough testing
  • When a user pastes the whole tracking script into the preferences page on the dashboard, strip out everything except the ID which we need... perhaps create a page explaining what is happening before doing this.
  • Handle noscript on dashboard / signup gracefully (remove all dashboard js?)
  • Allow users who are restarting an account with multiple blogs to disable some before restarting.
  • Take a look at Notion and Cargo for some neat ideas
  • Disabling a blog should free up the domain and handle associated
  • Removing a domain from a blog does NOT delete the key from redis. meaning if a user sets a domain once, it's effectively theirs forever. This is a bug!

File converters / codecs

  • Video posts (.mp4)
  • OPML files and tell John
  • Audio posts (.mp3 for now?)
  • Multi-file posts from inside one folder? 'Folder>' Tell Kevin, Nash and Roberto
  • Multi-file posts with the same name but different extension (image.txt and image.jpg)
  • Markdown Write a pandoc compatible markdown converter in javascript to resolve some of the performance issues with pandoc Perhaps just use
  • Add support for checkboxes and tell Matt and Shridhar

Photo posts

  • Expose exif data?
    • See if you can add comments to image metadata and tell Riley
    • Tell Mike

Write a importer tool which scrapes and imports content from any blog/website Jekyll converter importer

Internationalize i8n

Allow Blot to fallback to if the file does not exist on the blot server. Say the harddrive is wiped, we still would like to serve blog files


  • Re-implement folder verification feature and make use of the local content hash computation script to verify we have the correct version of a given file
  • Make the sync / rebuild proceses run with unpriviledged user permissions to ensure shit isnt fucked with user input... – Re-instate feature to check if a rogue sync took down the server and run sync on a seperate process
  • Add method to pause syncing and prevent future syncs then use this method with the create/remove blog migration too.
  • Ensure sync script is run by less priveledged user (just access to /tmp ? /blogs/{{ID}})?

Increase price for new customers to $40 a year. This will not affect existing customers.

Buy the .com


Add support for other payment methods

  • Bitcoin and tell Chaz

Start monthly newsletter with improvements, changes

Support embedding an image in a post by copy-pasting the Dropbox share link

Increase price for new customers to $60 a year. This will not affect existing customers.

Git client:

  • Backdate existing commits (perhaps set file ctime using info from git log?) This would sidestep the frustration experienced by Gavin when he imported an existing repository.
  • Extend sync lock during long syncs
  • Write test to simulate process dying and restarting mid-pull. Does the client recover? What happens if a pull fails midway? Does git recover?
  • Write tests for a series of random client operations (pull, add, push, move, reset, delete) that can be seeded and reliably re-run in the case of failure.
  • Move to neat promise chain api when 2.0 comes out
  • Test that client must keep sending new entries and deleted entries when it recieved an error from otherwise you get ghost posts...
  • send nice error message with instructions for 413 request too large: "git reset HEAD^" etc...
  • Thoroughly document:
    • write
    • read
    • sync
  • Tidy up tests and reduce size and runtime
  • Add documentation and an explanation for how to mirror blot blog repo on Github or Gitlab:
  • This client should acquire a lock on the blog's folder before doing stuff to it more generally, especially during initialization etc...
  • what happens if user changes their handle? will pushing break?
    • I want them to be able to keep using their old one until someone else claims it, then I want 401 unauthorized, please reauthenticate with new username... but the remote path will be wrong?
  • Rate limit authentication route?

Dropbox client:

  • Adding an additional blog to existing app folder under constant webhooks failed. New blog had correct folder but old blog still used root. I guess we need to acquire a lock on ALL blogs interacting with that dropbox account.
  • Extend sync lock during long syncs
  • Write test to simulate process dying and restarting mid-pull. Does the client recover?
  • Write tests for a series of random dropbox client operations (pull, add, push, move, reset, delete) that can be seeded and reliably re-run in the case of failure.
  • Look into getAccessTokenFromCode on DBSDK repo to avoid the mess in get_account.js
  • Gracefuly retry wrapper around Dropbox
  • Can we write to a folder_id instead of a path? It would be nice to be able to move the blog's folder even when writing the initial files to it, for example...
  • This should be simple once we copy the exisiting state of the blog folder across. But right now it doesn't really do much. It resets the local server folder. Then resyncs.
  • Update to latest version of Dropbox client.
  • Make the folder in Dropbox rename automatically when the user changes the username for one of their multiple blogs?

Support 2FA (Two factor authentication)

Consider supporting Open Graph

Add support for entry property with escaped double quotes, tell Jay


  • Improve error pages
  • Recompile nginx with neccessary dependencies for auto-ssl instead of openresty
  • Install nginx fail2ban & http2

Support linking to another blog post by its file path

  • This would help with the importer to fix broken links

Generative tree

  • Add a generative tree illustration to account page that is 'seeded' when you sign up and grows as you keep your account open. Slowly, day by day. Would still be growing in 1000 years should your account stay open that long.
  • Learn about old trees
  • Learn how to make a generative illustration and render it quickly on the server
  • I like this idea because it's sort of anti-Farmville (i.e. click-to-grow, engage-to-grow). The tree just grows. No badgering to post more to keep the tree alive, all you have to do is keep your account. When you delete your account you just see the tree, and a thank you. Obviously don't do anything tacky like cut the tree down or anything. That would be horrible.

Removing Date metadata from a post should reset its date to the file's creation date

  • Currently nothing changes.

Add support for 'time' metadata property

  • Useful for posts with path-based-dates.
  • e.g. 'Time: 4:15pm'
  • Would append to any other date associated with the post.

Download the webpage for bookmark files and try to extract title + summary

Add a file dependency / dependents list to each entry then use this to rebuild dependent entries when, for example, a public image is updated.

Add support for comments via webmentions

Thumbnail generator

  • Improve transformer so it checks a file's MTIME against a stored value before rehashing the file
  • Generate thumbnails for GIFs / SVG thum
  • Prioritize faces
  • Aim to generate distinct thumbnails across the blog
  • Try to crop out ruined borders. E.g. when making a square crop of a rectangular image with a border, crop into the image as well to remove the border-on-three-sides effect
  • Extract color palette too for the image
  • Run quickly first time, then run in the background to pick the best thumbnail
  • Offer imgix style API for embedding thumbnails

Migrate code from require('mime') to require('mime-types') since it doesn't use a global default type. Remove the mime node module.

Move off the CDN

  • Work out why blotcdn is so slow for
  • Backup s3 buckets every day? delete those older than a month?

Migrate code from require('../../../') to shortcuts in node_modules

Remove the dirToModule code and hard link the require references.

Use \<select> optgroup on timezone select dropdown to subdivide zones by current time, and steal the presentation format used by basecamp.


  • Add hourly local redis rdb dumps
  • Add script to roll back into hourly local db dumps and remote backups
  • Delete backups older than a month from s3 automatically

Add daemon for zero-downtime node restart

Move to pretty IDs for everything

Re-do url redirector to use route-parser and properly support regular expressions

Handle queries properly

Giphy url support

Catch rename failed to find a match for scrapboox/patch_bunny_slippers.jpg -> /patch_bunny_slippers.png

Indicate that some posts' permalink will not change (if metadata) on the dashboard when setting the blog's permalink format. Tell Chet.

Can rename tolerate a minor file size change?

Add filtering by date to 404 log

Move daily update generator from scripts to app folder

If entries share publish date, sort them by blot creation date

Rewrite footnote links in a teaser from #frag to {{permalink}}#frag

Add plugin for inline popover footnotes

Enable hyphenation again then tell rodericus

Investigate atompub support for Marsedit and tell Chet

Find cause of fontconfig error / warning

Password protection for blogs

Create an API for Blot

Add option to enable hard line breaks


  • Install time mover library
  • add proper error handling to email
  • make it easier to pass in variables


  • check each id has an entry and each entry has an id
  • check menu is right (pages exist, non deleted etc...)
  • generate fake entries for id clash
  • must check each blog folder exists...

Move to some SQL for storing each entry's input and output...

Fix image caption plugin to be semantic

Devise nice way to declare unit tests for a file which don't need to be run on server start but can be run programmatically...

Add button to remove avatar from settings page

Incorporate typographic features from textile

queue scheduled entries in redis this makes each server less stateful

Noindex blog search results pages

Re-enable CSP on blot site in a way that works in Safari

Popular entry list

Related entry list

Expose list of rendering errors to callback

Prevent uploads will still pipe large files on the server

Add rewrite feature, e.g. rewrite /randomColor to /public/randomColor

Menu needs concurrency

Push archives feature

Banned permalinks are possible when page:yes

Incorporate disk space monitor to alert for low space

Archive logfiles with backups

Generate list of external api dependencies and follow changes for each

Make drafts preview file identical (construct iframe based on window.location.href) and use copyref

Undo option for form changes

Store metadata for each file (type, size, mtime)

Add an explanation for the folder migrator...

Seperate the settings for blog and user & billing

Implement custom CSS for syntax highlight plugin

Ensure Youtube plugin still functions if apis fails

Prevent image zoom plugin from zooming emojies

Embed plugin

Soundcloud embeds and tell Jonas Nashp Anders

Create script to export Blot sites to common formats and let Roberto know

Add transactional emails notifying user of changes to their email or password.


It could be nice to link to [@path/to/file.txt] and resolve the URL automatically?

  • would need a dependency tree, if change were made to file.txt, the linker would need to be updated too.
  • would leave a trail, like regular permalinks, so file.txt could be moved without breaking anything.

Add 'opener=false' to target="_blank" links?

Consider offering a broken link checker service?

Add neat interface to customize blog level variables?

add support for dynamic partials to make collections possible e.g. {{> /{tag}.html}} ?

Move from preview files -> webloc / .url files ?

Consider adding date format localization with Moment

Create webloc to live version for each entry? I LIKE

Move to new api file ids for Dropbox renames?

Move from 'archives' to 'archive'?

Look into how Jekyll does data files and possibly support?

Consider using the fancy new stripe payment form on the public site?

Consider adding markdown support for mermaid?

Create a comment system to replace Disqus

Create an email list system to replace Tiny Letter

Add .lhs support and tell Roy

Add support for github style checkboxes and tell Christian

Add a cool bookmarklet which drafts a post a la

Consider allowing users to buy domains on Blot through