Syncpad is a lightweight, terminal-based notepad written in pure C that uses Git as a silent backend database to synchronize notes across multiple computers.
Used github cli for autocomplete, claude for documentation and debugging
Syncpad is a lightweight, terminal-based notepad written in pure C that uses Git as a silent backend database to synchronize notes across multiple computers.
Used github cli for autocomplete, claude for documentation and debugging
I built Syncpad to sync short notes and links across my devices without opening a browser or smth else and to learn C better. It’s a terminal notepad that uses Git to sync, with cross-compatibility for Linux, macOS, and Windows. The hardest part was cross-platform C development. I spent hours of attempts fixing windows compatibility, then another bus hit me with Linux binary compatibility. I’m proud that i built something I would actually use and shipped something that works across platforms (even though going through that CI/CD hell was not pleasant), learning C the hard way.
I built Syncpad to solve a simple problem of syncing short notes, links, and snippets across my devices without opening a browser or heavy app. As a learning project to dive deeper into C programming, it turned into a notepad with Git-based sync and cross-platform support (Linux, macOS, Windows) The core concept was straightforward which was to use ncurses for the UI, libgit2 for git operations, and keep everything lightweight, but the execution revealed just how complex “simple” cross-platform C development can be. The first half was spent building the project, testing it locally on arch then wrestling with windows compatibility through 8 failed CI/CD attempts, switching between PDCurses and ncurses, before finally bundling DLLs in a zip file. Cross-platform bs emerged everywhere: windows doesn’t have touch, needs cd /d instead of cd, and required explicit ctrl key macros. After implementing line wrapping and scrolling, I spent hours fixing installation scripts that broke when piped through curl | bash.
The real nightmare came in the final 2.5 hours: Linux binary compatibility. My Alpine Linux build (musl libc) was incompatible with Arch Linux (glibc), triggering 9 releases as I fought through static linking hell. Each attempt revealed new missing dependencies: libgit2 needed libssh2, which needed openssl, zlib, and others which happened 3 more times. After switching from Alpine to Ubuntu and implementing proper -Wl,-Bstatic linker flags, v1.5.0 finally worked. I got so deep into CI/CD perfectionism, obsessively fixing each build failure, that I forgot to log till the end. The project taught me that C is very very hard and cross-platform development is a hell.
Log in to leave a comment