In Brief

Catch a Bird — I made it for my own sanity

Why this matters now: Eduard’s tiny web app "Catch a Bird" shows how small, self-hosted projects can reconnect people and revive personal energy without chasing scale or VC attention.

Eduard from Budapest built a one-file frontend and a small FastAPI + Postgres backend to host a playful "tree" where strangers drop short sentences about something that made them happy; each message "lands as a bird" on the tree. The site uses DeepL for on-demand translation and runs on a single Hetzner box with self-hosted analytics. According to the project page, the author almost left it unfinished — but seeing messages from strangers gave him energy to keep it alive.

"I made a new one, for my own sanity."

Why this matters: it’s a reminder that not every engineering success needs to be a scale play. Small infra, low friction, and a clear emotional goal can create meaningful interactions quickly. The Hacker News thread also picked up a friendly nod from Hetzner, showing how modest infra choices and community goodwill can amplify a personal project.

Deep Dive

your C is not standard C

Why this matters now: The post "your C is not standard C" highlights concrete incompatibilities between ISO C and dominant toolchains — important for teams writing portable C, maintaining safety-critical code, or building cross-platform libraries right now.

A recent, example-packed post argues that the C you see on paper is frequently a different dialect from the one produced by mainstream compilers and libraries. The author lists a grab-bag of gotchas: compilers treating keywords or constructs as extensions, libc headers exposing macros that don’t reflect runtime state, and toolchains silently ignoring certain standard mechanisms. The original post compiles these surprises and practical breakage scenarios; you can read it at the original post.

A few concrete highlights stick. The post points out that gcc and clang treat asm as an extension, even though asm is a valid non-reserved identifier in ISO C; that glibc defines FLT_ROUNDS as 1 so it doesn't reflect changes from fesetround at runtime; and that gcc doesn't honor standard pragmas — they behave effectively as no-ops. The author calls out additional misalignments: clang handling of const on function return types, musl's stdarg.h not matching the new C23 single-argument va_start form, and non-portable interactions between POSIX math-error semantics and ISO C. One line in the post nails the tone:

"gcc still doesn't support any of the standard pragmas — they're just no-ops in gcc."

On Hacker News, the thread added practical context rather than surprise. One commenter noted that because gcc lacks FENV_ACCESS support, "all fesetround calls are always UB, it is valid for it to act as if the rounding mode never changes" — an important explanation if you rely on floating-point environment control across translation units. That is, some of the deviations are not just oversight but performance and compatibility trade-offs baked into decades of toolchain behavior.

What should readers take away? First, toolchain assumptions matter. If your project must be strictly standards-conforming — for portability audits, safety certification, or cross-platform libraries — you will need to test and pin the exact compiler, libc, and header behavior, not just your code against the standard text. Second, undef behavior and nonconforming defaults can silently change semantics; code that seems portable can break when moved between glibc and musl, or compiled with different optimization levels. Third, the C ecosystem has reasons for some of these choices — historical ABI constraints, performance, and backward compatibility — but those reasons are rarely harmless.

If you maintain C code intended to be portable, consider adding tests that exercise corner cases the post highlights: compile-time checks for reserved identifiers, runtime tests for FLT_ROUNDS and fesetround interaction, and cross-libc CI runs. For library authors, documenting the expected toolchain and libc guarantees you rely on reduces future surprises for downstream users.

Closing Thought

Today’s feed offered a contrast: one story about the slow erosion between spec and reality in a foundational language, the other a small, humane project that proves engineering needn’t always be about scaling. Both matter because they remind us of two constant tensions in software: the need for exactness when correctness matters, and the value of small, well-scoped work when human experiences matter more than benchmarks.

Sources