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
|
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
|
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
|
siser
|
Sending emails with Mailgun in Go
|
Pure Bash Bible
|
Logging HTTP requests in Go
|
Hide header on scroll in Svelte
|
filerotate - Go library for rotating files
|
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
|
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
|
Companies using go
|
Big projects written in Go
|
Guide to predefined macros in C++ compilers (gcc, clang, msvc etc.)
|
Tutorial for CLSS flexbox library for Go
|
Experience porting 4.5k loc of C to Go (Facebook's CSS flexbox implementation Yoga)
|
Using MySQL in Docker for local testing In Go
|
Rotate log files daily in Go
|
Simple serialization format for logging and analytics in Go
|
Embedding build number in Go executable
|
3 ways to iterate in Go
|
HTTPS for free in Go, with little help of Let's Encrypt
|
Solo founders with profitable businesses, collected stories
|
Advanced command execution in Go with os/exec
|
Generating good unique ids in 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
|
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
|