Hi, author here! I'm excited to share a project I created to scratch my itch: a generator of a PDF calendar for ReMarkable tablets (and possibly other e-ink devices). It's pretty niche, but I'm really happy how it turned out.<p>It started as a PHP script [1] to quickly verify the idea. I got lots of great feedback on it [2], plus I used it for a few months myself. But I've hit a few technical walls with the (otherwise very competent) PDF framework I chose [3]. Most notably, it only supported a subset of CSS and layout was done using tables (hello, 2000s!). This led to a growing list of pain-points (links did not span the whole cell, not easy to re-order elements, etc.). I also kept thinking on how to make this project more approachable - without needing to install and know a bit of PHP. However, since it was a PHP script, that meant PDF generation on the backend. Which meant abuse protection, beefy server, etc.<p>So I rewrote the project from scratch [4], this time in JavaScript. Using react-pdf, I was able to move PDF generation entirely to client-side. It internally uses Yoga Layout, which means flexbox, finally! (subset, but still) React allowed me to extract and re-use components better. Internationalization was smooth as well. Web workers ensure the browser does not lock up (unless you're generating the full PDF in Firefox, for some reason...). Everything runs in client-side, no data is transferred to any servers. Privacy FTW!<p>There's many features available [5], but one I wanted to highlight here is how I've achieved sharing and preserving configuration (so that you can share it with friends or regenerate the calendar next year). Since I wanted to avoid storing any information on my or (even worse) third-party servers, the options were limited. Stuffing the data into the URL was probably possible. But it's unclear what are the safe limits of URL length. Plus, you can easily lose the URL. Downloading the data (a JSON file? Copy & paste?) was also clunky - how to explain to users what this file is? It can also be easily misplaced.
Then I realized - PDF files can have embedded file attachments :) So I'm saving the configuration file inside the generated PDF calendar. So if you ever want to reload the same settings (they are backwards compatible), you just upload the same PDF file (of course, PDF parsing happens on the client-side only as well). It's much safer approach and more intuitive - you will always have your PDF calendar file :)<p>In case you give my server the hug of death, the app is also available on GitHub Pages: <a href="https://recalendar.klimer.eu/" rel="nofollow">https://recalendar.klimer.eu/</a><p>While the current version is tested only on ReMarkable tablets, it should be fairly easy to add support for other devices. Please open a new issue on GitHub, ideally with the specification of the device (screen size in pixels or mm).<p>[1] <a href="https://github.com/klimeryk/recalendar/" rel="nofollow">https://github.com/klimeryk/recalendar/</a><p>[2] <a href="https://www.reddit.com/r/RemarkableTablet/comments/odpl07/recalendar_opensource_highly_customizable/" rel="nofollow">https://www.reddit.com/r/RemarkableTablet/comments/odpl07/re...</a><p>[3] <a href="https://mpdf.github.io/" rel="nofollow">https://mpdf.github.io/</a><p>[4] <a href="https://github.com/klimeryk/recalendar.js/" rel="nofollow">https://github.com/klimeryk/recalendar.js/</a><p>[5] <a href="https://recalendar.me/features" rel="nofollow">https://recalendar.me/features</a>