Home
Software
TIL
Contact Me
all
259
ai
2
bash
1
c++
15
css
1
devops
1
edna
6
go
43
llm
1
mac
2
notion
3
python
1
svelte
10
til
13
ui
2
webdev
12
win32
6
zed
2
259 articles
2025
Fixing Zed's debugger keybindings
Ideas for faster web dev cycle
Zed debug setup for go server / Svelte web app
AltTab for Mac OS
Stage manager in Mac OS
til, mac
lazy import of JavaScript modules
Using await in Svelte 5 components
vite /rollup manualChunks
Increase software sales by 50% or more
File sync is very slow
New Edna feature: multiple notes
Evolving Edna Ask AI UI
Desktop UI frameworks written by a single person
Implementing UI translation in SumatraPDF, a C++ Windows application
Calling Grok, OpenAI, Anthropic, Google, OpenRouter API from the browser
Case study of over-engineered C++ code
Increase open file limit on Ubuntu Linux
Explaining nil interface{} gotcha in Go
Size textarea to content
All about Svelte 5 snippets
C++ engineering decision in SumatraPDF code
Bugs I fixed in SumatraPDF
Implementation of optimized vector of strings in C++ in SumatraPDF
Custom search UI in CodeMirror 6 and Svelte 5
Notion-like compact table of contents in JavaScript
Go is 80/20 language
Automatic Chrome Dev Tools workspace setup
How I made SumatraPDF crash less
Ban std::string
Compressing for the browser in Go
Thoughts on C/C++ killer
Implementing nested context menu in Svelte 5
Idea for code editors
Optimizing calling Windows DLL functions in Go
Simplest C++ callback, from SumatraPDF
Why Go iterators are ugly, clever and elegant
Showing UI on mouse move, in Svelte 5
2024
Man vs. AI: optimizing JavaScript (Claude, Cursor)
Modern C++
Implementing Notion-like table of contents in JavaScript
Porting a medium-sized Vue application to Svelte 5
Changing font size in Windows dialog in C++
2023
How I implemented wc in the browser in 3 days
Advanced markdown processing in Go
Persisted Svelte store using IndexedDB
Programming articles
I’m a Go freelancer for hire
Go programming articles
go
Business articles
2022
Tech note: speed of iteration in programming
Day 35: fixed onedrive, gdrive token refresh
Day 34: more backblaze, refactorings
Tech note: JavaScript debugging helpers
Day 33: more backblaze
Day 32: optimizations, backblaze
JavaScript optimization story
Day 31: tweaking bookmarks list
Day 30: better dialogs
Day 29: optimizing file representation and s3
Programmer productivity: lines of code edition
Day 28: OneDrive support, more file properties
Day 27: better Google Drive login, One Drive support
Day 26: more google drive support
Day 25: Google Drive support
Day 24: dialog refactoring
Day 23: file copy
Day 22: file properties
Day 21: s3 create new dir, last modification time
Day 20: fs refactoring
Find programming work by increasing luck surface area
Day 19: analytics, context menu
Day 18: improving s3 upload
Day 17: file download
Day 16: bookmarks
Filerion tech stack
Day 15: text preview
Filerion marketing
Day 14: image preview, file rename
S3 and directories
Upload files from your computer
Day 13: local fs fixes
Using Roam Research for productivity
Day 12: s3 upload and delete directories
Day 11: upload file to local fs
Day 10: s3 file delete, ui tweaks
Day 9: Dropbox upload
Day 8: more file delete, file upload
Thoughts on documentation
Day 7: context menu, file delete
Day 6: Dropbox fix, bug fixes and small improvements
Tech note: Dropbox login
Day 5: setting up a website
Thoughts on getting user feedback
Day 4: s3, sorting, remembering credentials
Thoughts on developer productivity
Day 3: Dropbox
Day 2: displaying list of files
Day 1: tech stack, creating project from scratch
Day 0: the idea
Diary of a solo dev building a web app
Extreme #include discipline for C++ code
2021
@levelsio and survivorship bias
Typescript basics
Vim Reference
Using Notion API Go client
Using Go instead of bash for scripts
Using GitHub Actions with Go
atomicfile - robustly writing to a file in Go
go
siser
Sending emails with Mailgun in Go
go
Pure Bash Bible
Logging HTTP requests in Go
Hide header on scroll in Svelte
filerotate - Go library for rotating files
go
Lessons learned from 15 years of SumatraPDF
How I use Roam Research
2019
List of ePub format readers and viewers for Windows
List of CHM readers and viewers for Window
Pigz windows port
List of website with free eBooks in EPUB and MOBI formats
List of mobi format readers and viewers for Windows
The Silver Searcher windows port
List of CBR, CBZ comic book readers for windows
The things we do to ship desktop software
Lessons learned porting 50k loc from Java to Go
About me
Trade offs in designing versatile log format
Social media image sizes
Basics of freelancing
2018
Powering a blog with Notion and Netlify
Summary of “Sell to Strangers” video about content marketing
Summary Of "The Mom test" book about validating business ideas
Summary of Founders Battle Talk #7 about SEO
Software
Portable Executable File Format
How I reverse engineered Notion API
Go Cookbook
go
Advanced web spidering with Puppeteer
Writings
Finding freelancers
Fuzzing Markdown parser written in Go
Essentials of Starting Indie Business
2017
57 MicroConf videos for self-funded software businesses
A short guide to marketing for developers
Using MySQL in Docker for local testing in Python
Rewritten - tales of rewriting software from X to Go
go
Companies using go
go
Big projects written in Go
go
Guide to predefined macros in C++ compilers (gcc, clang, msvc etc.)
Tutorial for CLSS flexbox library for Go
go
Experience porting 4.5k loc of C to Go (Facebook's CSS flexbox implementation Yoga)
go
Using MySQL in Docker for local testing In Go
go
Rotate log files daily in Go
go
Simple serialization format for logging and analytics in Go
go
Embedding build number in Go executable
go
3 ways to iterate in Go
go
HTTPS for free in Go, with little help of Let's Encrypt
go
Solo founders with profitable businesses, collected stories
Advanced command execution in Go with os/exec
go
Generating good unique ids in Go
go
Small business stories
Analyzing browserify bundles to minimize JavaScript bundle size
2016
Optimizing JavaScript by using arrays instead of objects
2015
Extracting files from .7z archives in Go
Go package for better guid generation
Accessing GitHub API from Go
2014
Improving speed of SMAZ compressor by 2.6x/1.5x
Tip for per-test verbose logging in Go
SumatraPDF 3.0 released
SumatraPDF 2.5.2 released
2013
Using Fabric for deploying server software
SumatraPDF 2.4 released
How I ported pigz from Unix to Windows
2012
Thoughts on Go after writing 3 websites
SumatraPDF 2.2 released
Design and implementation of translation system for desktop software
Speeding up Go with custom allocators
Hiding duplicate content from your site via robots.txt
How I sped up Go by 20% (or is Go really slower than Java?)
Websites with free ePub and mobi ebooks
SumatraPDF 2.1 released
Buying a certificate for signing windows applications
SumatraPDF 2.0 released
2011
A list of chm readers/viewers for Windows
Showing html from memory in embedded web control on windows
SumatraPDF 1.9 released
SumatraPDF 1.8 released
SumatraPDF 1.7 released
Experience porting 4k lines of C code to go
SumatraPDF 1.6 released
Easy vs. probable or how to make money with software
90% of success is showing up - a proof
SumatraPDF 1.5 released
SumatraPDF 1.4 released
XML is really, really slow
My social marketing failure
SumatraPDF 1.3 released
Writing a custom installer for Windows software
2010
Executable compressors comparisons: upx 3.07w vs. mpress 2.17
SumatraPDF 1.2 released
Using averages - a common performance measurement mistake
8 habits for becoming a better programmer
Preventing duplicate posts in forum or blog commenting software
Value your time
Startup management lessons from “The Social Network”
Marketing lessons from WebP launch
SEO is harder than you think
Tools that find bugs in c and c++ code via static code analysis
Go vs. Python for a simple web server
SumatraPDF 1.1 release
Summary of talk on continuous deployment
uISV stories
Productivity ideas
E-books economics
You have to implement to understand
Best captcha is exotic captcha
2009
SumatraPDF 1.0 released
Sumatra 0.9.4 release
Where do bugs come from?
ssh tips
Summary of David Ditzel talk on binary translation
2008
SumatraPDF 0.9.3 released
SumatraPDF 0.9.1 released
SumatraPDF 0.9 released
realloc() on Windows vs. Linux
SumatraPDF 0.8.1 release
gflags - a debugging story
Variadic Macros (C++)
Sumatra 0.8 released
2007
Sumatra PDF 0.7 released
Sane #include hierarchy for C and C++
SumatraPDF 0.6 released
A debugging story
Few things I’ve learned when writing Sumatra PDF
SumatraPDF 0.5 released
SumatraPDF 0.4 released
2006
Sumatra PDF 0.3 released
How I improved SumatraPDF performance by ~60%
Paradox of bad comments
Performance optimization story
Sumatra PDF 0.2 released
Sumatra PDF is born
Designing web forums software
Document your software
Embedding binary resources on Windows
Compile-time asserts in C
Basics of writing DOS .bat batch files
2005
High-resolution timer for timing code fragments
Accurate timers on Windows
2004
Review of “Hot text - web writing that works”
2003
Writing to sell
On difference between amateur and professional shareware
2002
Good programming practices
The future is here, it’s just not evenly distributed
Principle of good design: discoverability
ui
Bugs and eyeballs
Engineering school (summary of Rick Catell talk)
What I've learned from "After the Gold Rush"
2001
Engineering and Computer Science in the Real World

Home
Software
TIL
Contact Me