The best Hacker News stories from Show from the past day
Latest posts:
Show HN: Vertex.js – A 1kloc SPA Framework
Vertex is a 1kloc SPA framework containing everything you need from React, Ractive-Load and jQuery while still being jQuery-compatible.<p>vertex.js is a single, self-contained file with no build step and no dependencies.<p>Also exhibits the curious quality of being faster than over a decade of engineering at Facebook in some cases: <a href="https://files.catbox.moe/sqei0d.png" rel="nofollow">https://files.catbox.moe/sqei0d.png</a>
Show HN: SQLite for Rivet Actors – one database per agent, tenant, or document
Hey HN! We posted Rivet Actors here previously [1] as an open-source alternative to Cloudflare Durable Objects.<p>Today we've released SQLite storage for actors (Apache 2.0).<p>Every actor gets its own SQLite database. This means you can have millions of independent databases: one for each agent, tenant, user, or document.<p>Useful for:<p>- AI agents: per-agent DB for message history, state, embeddings<p>- Multi-tenant SaaS: real per-tenant isolation, no RLS hacks<p>- Collaborative documents: each document gets its own database with built-in multiplayer<p>- Per-user databases: isolated, scales horizontally, runs at the edge<p>The idea of splitting data per entity isn't new: Cassandra and DynamoDB use partition keys to scale horizontally, but you're stuck with rigid schemas ("single-table design" [3]), limited queries, and painful migrations. SQLite per entity gives you the same scalability without those tradeoffs [2].<p>How this compares:<p>- Cloudflare Durable Objects & Agents: most similar to Rivet Actors with colocated SQLite and compute, but closed-source and vendor-locked<p>- Turso Cloud: Great platform, but closed-source + diff use case. Clients query over the network, so reads are slow or stale. Rivet's single-writer actor model keeps reads local and fresh.<p>- D1, Turso (the DB), Litestream, rqlite, LiteFS: great tools for running a single SQLite database with replication. Rivet is for running lots of isolated databases.<p>Under the hood, SQLite runs in-process with each actor. A custom VFS persists writes to HA storage (FoundationDB or Postgres).<p>Rivet Actors also provide realtime (WebSockets), React integration (useActor), horizontal scalability, and actors that sleep when idle.<p>GitHub: <a href="https://github.com/rivet-dev/rivet" rel="nofollow">https://github.com/rivet-dev/rivet</a><p>Docs: <a href="https://www.rivet.dev/docs/actors/sqlite/">https://www.rivet.dev/docs/actors/sqlite/</a><p>[1] <a href="https://news.ycombinator.com/item?id=42472519">https://news.ycombinator.com/item?id=42472519</a><p>[2] <a href="https://rivet.dev/blog/2025-02-16-sqlite-on-the-server-is-misunderstood/">https://rivet.dev/blog/2025-02-16-sqlite-on-the-server-is-mi...</a><p>[3] <a href="https://www.alexdebrie.com/posts/dynamodb-single-table/" rel="nofollow">https://www.alexdebrie.com/posts/dynamodb-single-table/</a>
Show HN: Audio Toolkit for Agents
Show HN: Xmloxide – an agent-made Rust replacement for libxml2
Recently several AI labs have published experiments where they tried to get AI coding agents to complete large software projects.<p>- Cursor attempted to make a browser from scratch: <a href="https://cursor.com/blog/scaling-agents" rel="nofollow">https://cursor.com/blog/scaling-agents</a><p>- Anthropic attempted to make a C Compiler: <a href="https://www.anthropic.com/engineering/building-c-compiler" rel="nofollow">https://www.anthropic.com/engineering/building-c-compiler</a><p>I have been wondering if there are software packages that can be easily reproduced by taking the available test suites and tasking agents to work on projects until the existing test suites pass.<p>After playing with this concept by having Claude Code reproduce redis and sqlite, I began looking for software packages where an agent-made reproduction might actually be useful.<p>I found libxml2, a widely used, open-source C language library designed for parsing, creating, and manipulating XML and HTML documents. Three months ago it became unmaintained with the update, "This project is unmaintained and has
[known security issues](<a href="https://gitlab.gnome.org/GNOME/libxml2/-/issues/346" rel="nofollow">https://gitlab.gnome.org/GNOME/libxml2/-/issues/346</a>). It is foolish to use this software to process untrusted data.".<p>With a few days of work, I was able to create xmloxide, a memory safe rust replacement for libxml2 which passes the compatibility suite as well as the W3C XML Conformance Test Suite. Performance is similar on most parsing operations and better on serialization. It comes with a C API so that it can be a replacement for existing uses of libxml2.<p>- crates.io: <a href="https://crates.io/crates/xmloxide" rel="nofollow">https://crates.io/crates/xmloxide</a><p>- GitHub release: <a href="https://github.com/jonwiggins/xmloxide/releases/tag/v0.1.0" rel="nofollow">https://github.com/jonwiggins/xmloxide/releases/tag/v0.1.0</a><p>While I don't expect people to cut over to this new and unproven package, I do think there is something interesting to think about here in how coding agents like Claude Code can quickly iterate given a test suite. It's possible the legacy code problem that COBOL and other systems present will go away as rewrites become easier. The problem of ongoing maintenance to fix CVEs and update to later package versions becomes a larger percentage of software package management work.
Show HN: SplatHash – A lightweight alternative to BlurHash and ThumbHash
Hi HN,<p>I built SplatHash. It's a lightweight image placeholder generator I wrote to be a simpler, faster alternative to BlurHash and ThumbHash.<p>Repo: <a href="https://github.com/junevm/splathash" rel="nofollow">https://github.com/junevm/splathash</a>
Show HN: SplatHash – A lightweight alternative to BlurHash and ThumbHash
Hi HN,<p>I built SplatHash. It's a lightweight image placeholder generator I wrote to be a simpler, faster alternative to BlurHash and ThumbHash.<p>Repo: <a href="https://github.com/junevm/splathash" rel="nofollow">https://github.com/junevm/splathash</a>
Show HN: Decided to play god this morning, so I built an agent civilisation
at a pub in london, 2 weeks ago - I asked myself, if you spawned agents into a world with blank neural networks and zero knowledge of human existence — no language, no economy, no social templates — what would they evolve on their own?<p>would they develop language? would they reproduce? would they evolve as energy dependent systems? what would they even talk about?<p>so i decided to make myself a god, and built WERLD - an open-ended artificial life sim, where the agent's evolve their own neural architecture.<p>Werld drops 30 agents onto a graph with NEAT neural networks that evolve their own topology, 64 sensory channels, continuous motor effectors, and 29 heritable genome traits. communication bandwidth, memory decay, aggression vs cooperation — all evolvable. No hardcoded behaviours, no reward functions. - they could evolve in any direction.<p>Pure Python, stdlib only — brains evolve through survival and reproduction, not backprop. There's a Next.js dashboard ("Werld Observatory") that gives you a live-view: population dynamics, brain complexity, species trajectories, a narrative story generator, live world map.<p>thought this would be more fun as an open-source project!<p>can't wait to see where this could evolve - i'll be in the comments and on the repo.<p><a href="https://github.com/nocodemf/werld" rel="nofollow">https://github.com/nocodemf/werld</a>
Show HN: Decided to play god this morning, so I built an agent civilisation
at a pub in london, 2 weeks ago - I asked myself, if you spawned agents into a world with blank neural networks and zero knowledge of human existence — no language, no economy, no social templates — what would they evolve on their own?<p>would they develop language? would they reproduce? would they evolve as energy dependent systems? what would they even talk about?<p>so i decided to make myself a god, and built WERLD - an open-ended artificial life sim, where the agent's evolve their own neural architecture.<p>Werld drops 30 agents onto a graph with NEAT neural networks that evolve their own topology, 64 sensory channels, continuous motor effectors, and 29 heritable genome traits. communication bandwidth, memory decay, aggression vs cooperation — all evolvable. No hardcoded behaviours, no reward functions. - they could evolve in any direction.<p>Pure Python, stdlib only — brains evolve through survival and reproduction, not backprop. There's a Next.js dashboard ("Werld Observatory") that gives you a live-view: population dynamics, brain complexity, species trajectories, a narrative story generator, live world map.<p>thought this would be more fun as an open-source project!<p>can't wait to see where this could evolve - i'll be in the comments and on the repo.<p><a href="https://github.com/nocodemf/werld" rel="nofollow">https://github.com/nocodemf/werld</a>
Show HN: I ported Manim to TypeScript (run 3b1B math animations in the browser)
Hi HN, I'm Narek. I built Manim-Web, a TypeScript/JavaScript port of 3Blue1Brown’s popular Manim math animation engine.<p>The Problem: Like many here, I love Manim's visual style. But setting it up locally is notoriously painful - it requires Python, FFmpeg, Cairo, and a full LaTeX distribution. It creates a massive barrier to entry, especially for students or people who just want to quickly visualize a concept.<p>The Solution: I wanted to make it zero-setup, so I ported the engine to TypeScript. Manim-Web runs entirely client-side in the browser. No Python, no servers, no install. It runs animations in real-time at 60fps.<p>How it works underneath:
- Rendering: Uses Canvas API / WebGL (via Three.js for 3D scenes).
- LaTeX: Rendered and animated via MathJax/KaTeX (no LaTeX install needed!).
- API: I kept the API almost identical to the Python version (e.g., scene.play(new Transform(square, circle))), meaning existing Manim knowledge transfers over directly.
- Reactivity: Updaters and ValueTrackers follow the exact same reactive pattern as the Python original.<p>Because it's web-native, the animations are now inherently interactive (objects can be draggable/clickable) and can be embedded directly into React/Vue apps, interactive textbooks, or blogs. I also included a py2ts converter to help migrate existing scripts.<p>Live Demo: <a href="https://maloyan.github.io/manim-web/examples" rel="nofollow">https://maloyan.github.io/manim-web/examples</a>
GitHub: <a href="https://github.com/maloyan/manim-web" rel="nofollow">https://github.com/maloyan/manim-web</a><p>It's open-source (MIT). I'm still actively building out feature parity with the Python version, but core animations, geometry, plotting, and 3D orbiting are working great. I would love to hear your feedback, and I'll be hanging around to answer any technical questions about rendering math in the browser!
Show HN: Now I Get It – Translate scientific papers into interactive webpages
Understanding scientific articles can be tough, even in your own field. Trying to comprehend articles from others? Good luck.<p>Enter, Now I Get It!<p>I made this app for curious people. Simply upload an article and after a few minutes you'll have an interactive web page showcasing the highlights. Generated pages are stored in the cloud and can be viewed from a gallery.<p>Now I Get It! uses the best LLMs out there, which means the app will improve as AI improves.<p>Free for now - it's capped at 20 articles per day so I don't burn cash.<p>A few things I (and maybe you will) find interesting:<p>* This is a pure convenience app. I could just as well use a saved prompt in Claude, but sometimes it's nice to have a niche-focused app. It's just cognitively easier, IMO.<p>* The app was built for myself and colleagues in various scientific fields. It can take an hour or more to read a detailed paper so this is like an on-ramp.<p>* The app is a place for me to experiment with using LLMs to translate scientific articles into software. The space is pregnant with possibilities.<p>* Everything in the app is the result of agentic engineering, e.g. plans, specs, tasks, execution loops. I swear by Beads (<a href="https://github.com/steveyegge/beads" rel="nofollow">https://github.com/steveyegge/beads</a>) by Yegge and also make heavy use of Beads Viewer (<a href="https://news.ycombinator.com/item?id=46314423">https://news.ycombinator.com/item?id=46314423</a>) and Destructive Command Guard (<a href="https://news.ycombinator.com/item?id=46835674">https://news.ycombinator.com/item?id=46835674</a>) by Jeffrey Emanuel.<p>* I'm an AWS fan and have been impressed by Opus' ability to write good CFN. It still needs a bunch of guidance around distributed architecture but way better than last year.
Show HN: Now I Get It – Translate scientific papers into interactive webpages
Understanding scientific articles can be tough, even in your own field. Trying to comprehend articles from others? Good luck.<p>Enter, Now I Get It!<p>I made this app for curious people. Simply upload an article and after a few minutes you'll have an interactive web page showcasing the highlights. Generated pages are stored in the cloud and can be viewed from a gallery.<p>Now I Get It! uses the best LLMs out there, which means the app will improve as AI improves.<p>Free for now - it's capped at 20 articles per day so I don't burn cash.<p>A few things I (and maybe you will) find interesting:<p>* This is a pure convenience app. I could just as well use a saved prompt in Claude, but sometimes it's nice to have a niche-focused app. It's just cognitively easier, IMO.<p>* The app was built for myself and colleagues in various scientific fields. It can take an hour or more to read a detailed paper so this is like an on-ramp.<p>* The app is a place for me to experiment with using LLMs to translate scientific articles into software. The space is pregnant with possibilities.<p>* Everything in the app is the result of agentic engineering, e.g. plans, specs, tasks, execution loops. I swear by Beads (<a href="https://github.com/steveyegge/beads" rel="nofollow">https://github.com/steveyegge/beads</a>) by Yegge and also make heavy use of Beads Viewer (<a href="https://news.ycombinator.com/item?id=46314423">https://news.ycombinator.com/item?id=46314423</a>) and Destructive Command Guard (<a href="https://news.ycombinator.com/item?id=46835674">https://news.ycombinator.com/item?id=46835674</a>) by Jeffrey Emanuel.<p>* I'm an AWS fan and have been impressed by Opus' ability to write good CFN. It still needs a bunch of guidance around distributed architecture but way better than last year.
Show HN: Badge that shows how well your codebase fits in an LLM's context window
Small codebases were always a good thing. With coding agents, there's now a huge advantage to having a codebase small enough that an agent can hold the full thing in context.<p>Repo Tokens is a GitHub Action that counts your codebase's size in tokens (using tiktoken) and updates a badge in your README. The badge color reflects what percentage of an LLM's context window the codebase fills: green for under 30%, yellow for 50-70%, red for 70%+. Context window size is configurable and defaults to 200k (size of Claude models).<p>It's a composite action. Installs tiktoken, runs ~60 lines of inline Python, takes about 10 seconds. The action updates the README but doesn't commit, so your workflow controls the git strategy.<p>The idea is to make token size a visible metric, like bundle size badges for JS libraries. Hopefully a small nudge to keep codebases lean and agent-friendly.<p>GitHub: <a href="https://github.com/qwibitai/nanoclaw/tree/main/repo-tokens" rel="nofollow">https://github.com/qwibitai/nanoclaw/tree/main/repo-tokens</a>
Show HN: Badge that shows how well your codebase fits in an LLM's context window
Small codebases were always a good thing. With coding agents, there's now a huge advantage to having a codebase small enough that an agent can hold the full thing in context.<p>Repo Tokens is a GitHub Action that counts your codebase's size in tokens (using tiktoken) and updates a badge in your README. The badge color reflects what percentage of an LLM's context window the codebase fills: green for under 30%, yellow for 50-70%, red for 70%+. Context window size is configurable and defaults to 200k (size of Claude models).<p>It's a composite action. Installs tiktoken, runs ~60 lines of inline Python, takes about 10 seconds. The action updates the README but doesn't commit, so your workflow controls the git strategy.<p>The idea is to make token size a visible metric, like bundle size badges for JS libraries. Hopefully a small nudge to keep codebases lean and agent-friendly.<p>GitHub: <a href="https://github.com/qwibitai/nanoclaw/tree/main/repo-tokens" rel="nofollow">https://github.com/qwibitai/nanoclaw/tree/main/repo-tokens</a>
Show HN: Claude-File-Recovery, recover files from your ~/.claude sessions
Claude Code deleted my research and plan markdown files and informed me: “I accidentally rm -rf'd real directories in my Obsidian vault through a symlink it didn't realize was there: I made a mistake. “<p>Unfortunately the backup of my documentation accidentally hadn’t run for a month. So I built claude-file-recovery, a CLI-tool and TUI that is able to extract your files from your ~/.claude session history and thankfully I was able to recover my files. It's able to extract any file that Claude Code ever read, edited or wrote. I hope you will never need it, but you can find it on my GitHub and pip. Note: It can recover an earlier version of a file at a certain point in time.<p>pip install claude-file-recovery
Show HN: Claude-File-Recovery, recover files from your ~/.claude sessions
Claude Code deleted my research and plan markdown files and informed me: “I accidentally rm -rf'd real directories in my Obsidian vault through a symlink it didn't realize was there: I made a mistake. “<p>Unfortunately the backup of my documentation accidentally hadn’t run for a month. So I built claude-file-recovery, a CLI-tool and TUI that is able to extract your files from your ~/.claude session history and thankfully I was able to recover my files. It's able to extract any file that Claude Code ever read, edited or wrote. I hope you will never need it, but you can find it on my GitHub and pip. Note: It can recover an earlier version of a file at a certain point in time.<p>pip install claude-file-recovery
Show HN: Claude-File-Recovery, recover files from your ~/.claude sessions
Claude Code deleted my research and plan markdown files and informed me: “I accidentally rm -rf'd real directories in my Obsidian vault through a symlink it didn't realize was there: I made a mistake. “<p>Unfortunately the backup of my documentation accidentally hadn’t run for a month. So I built claude-file-recovery, a CLI-tool and TUI that is able to extract your files from your ~/.claude session history and thankfully I was able to recover my files. It's able to extract any file that Claude Code ever read, edited or wrote. I hope you will never need it, but you can find it on my GitHub and pip. Note: It can recover an earlier version of a file at a certain point in time.<p>pip install claude-file-recovery
Show HN: Unfucked - version all changes (by any tool) - local-first/source avail
I built <i>unf</i> after I pasted a prompt into the wrong agent terminal and it overwrote hours of hand-edits across a handful of files. Git couldn't help because I hadn't finished/committed my in progress work. I wanted something that recorded every save automatically so I could rewind to any point in time. I wanted to make it difficult for an agent to permanently screw anything up, even with an errant <i>rm -rf</i><p><i>unf</i> is a background daemon that watches directories you choose (via CLI) and snapshots every text file on save. It stores file contents in an object store, tracks metadata in SQLite, and gives you a CLI to query and restore any version. The install includes a UI, as well to explore the history through time.<p>The tool skips binaries and respects `.gitignore` if one exists. The interface borrows from git so it should feel familiar: <i>unf log</i>, <i>unf diff</i>, <i>unf restore</i>.<p>I say "UN-EF" vs U.N.F, but that's for y'all to decide: I started by calling the project Unfucked and got unfucked.ai, which if you know me and the messes I get myself into, is a fitting purchase.<p>The CLI command is `unf` and the Tauri desktop app is titled "Unfudged" (kids safe name).<p>How it works: <a href="https://unfucked.ai/tech" rel="nofollow">https://unfucked.ai/tech</a> (summary below)<p>The daemon uses FSEvents on macOS and inotify on Linux. When a file changes, `unf` hashes the content with BLAKE3 and checks whether that hash already exists in the object store — if it does, it just records a new metadata entry pointing to the existing blob. If not, it writes the blob and records the entry. Each snapshot is a row in SQLite. Restores read the blob back from the object store and overwrite the file, after taking a safety snapshot of the current state first (so restoring is itself reversible).<p>There are two processes. The core daemon does the real work of managing FSEvents/inotify subscriptions across multiple watched directories and writing snapshots. A sentinel watchdog supervises it, kept alive and aligned by launchd on macOS and systemd on Linux. If the daemon crashes, the sentinel respawns it and reconciles any drift between what you asked to watch and what's actually being watched. It was hard to build the second daemon because it felt like conceding that the core wasn't solid enough, but I didn't want to ship a tool that demanded perfection to deliver on the product promise, so the sentinel is the safety net.<p>Fingers crossed, I haven’t seen it crash in over a week of personal usage on my Mac. But, I don't want to trigger "works for me" trauma.<p>The part I like most: On the UI, I enjoy viewing files through time. You can select a time section and filter your projects on a histogram of activity. That has been invaluable in seeing what the agent was doing.<p>On the CLI, the commands are composable. Everything outputs to stdout so you can pipe it into whatever you want. I use these regularly and AI agents are better with the tool than I am:<p><pre><code> # What did my config look like before we broke it?
unf cat nginx.conf --at 1h | nginx -t -c /dev/stdin
# Grep through a deleted file
unf cat old-routes.rs --at 2d | grep "pub fn"
# Count how many lines changed in the last 10 minutes
unf diff --at 10m | grep '^[+-]' | wc -l
# Feed the last hour of changes to an AI for review
unf diff --at 1h | pbcopy
# Compare two points in time with your own diff tool
diff <(unf cat app.tsx --at 1h) <(unf cat app.tsx --at 5m)
# Restore just the .rs files that changed in the last 5 minutes
unf diff --at 5m --json | jq -r '.changes[].file' | grep '\.rs$' | xargs -I{} unf restore {} --at 5m
# Watch for changes in real time
watch -n5 'unf diff --at 30s'
</code></pre>
What was new for me: I came to Rust in Nov. 2025 honestly because of HN enthusiasm and some FOMO. No regrets. I enjoy the language enough that I'm now working on custom clippy lints to enforce functional programming practices. This project was also my first Apple-notarized DMG, my first Homebrew tap, and my second Tauri app (first one I've shared).<p>Install & Usage:<p><pre><code> > brew install cyrusradfar/unf/unfudged
</code></pre>
Then <i>unf watch</i> in a directory. <i>unf help</i> covers the details (or ask your agent to coach).<p>EDIT: Folks are asking for the source, if you're interested watch <a href="https://github.com/cyrusradfar/homebrew-unf" rel="nofollow">https://github.com/cyrusradfar/homebrew-unf</a> -- I'll migrate there if you want it.
Show HN: Unfucked - version all changes (by any tool) - local-first/source avail
I built <i>unf</i> after I pasted a prompt into the wrong agent terminal and it overwrote hours of hand-edits across a handful of files. Git couldn't help because I hadn't finished/committed my in progress work. I wanted something that recorded every save automatically so I could rewind to any point in time. I wanted to make it difficult for an agent to permanently screw anything up, even with an errant <i>rm -rf</i><p><i>unf</i> is a background daemon that watches directories you choose (via CLI) and snapshots every text file on save. It stores file contents in an object store, tracks metadata in SQLite, and gives you a CLI to query and restore any version. The install includes a UI, as well to explore the history through time.<p>The tool skips binaries and respects `.gitignore` if one exists. The interface borrows from git so it should feel familiar: <i>unf log</i>, <i>unf diff</i>, <i>unf restore</i>.<p>I say "UN-EF" vs U.N.F, but that's for y'all to decide: I started by calling the project Unfucked and got unfucked.ai, which if you know me and the messes I get myself into, is a fitting purchase.<p>The CLI command is `unf` and the Tauri desktop app is titled "Unfudged" (kids safe name).<p>How it works: <a href="https://unfucked.ai/tech" rel="nofollow">https://unfucked.ai/tech</a> (summary below)<p>The daemon uses FSEvents on macOS and inotify on Linux. When a file changes, `unf` hashes the content with BLAKE3 and checks whether that hash already exists in the object store — if it does, it just records a new metadata entry pointing to the existing blob. If not, it writes the blob and records the entry. Each snapshot is a row in SQLite. Restores read the blob back from the object store and overwrite the file, after taking a safety snapshot of the current state first (so restoring is itself reversible).<p>There are two processes. The core daemon does the real work of managing FSEvents/inotify subscriptions across multiple watched directories and writing snapshots. A sentinel watchdog supervises it, kept alive and aligned by launchd on macOS and systemd on Linux. If the daemon crashes, the sentinel respawns it and reconciles any drift between what you asked to watch and what's actually being watched. It was hard to build the second daemon because it felt like conceding that the core wasn't solid enough, but I didn't want to ship a tool that demanded perfection to deliver on the product promise, so the sentinel is the safety net.<p>Fingers crossed, I haven’t seen it crash in over a week of personal usage on my Mac. But, I don't want to trigger "works for me" trauma.<p>The part I like most: On the UI, I enjoy viewing files through time. You can select a time section and filter your projects on a histogram of activity. That has been invaluable in seeing what the agent was doing.<p>On the CLI, the commands are composable. Everything outputs to stdout so you can pipe it into whatever you want. I use these regularly and AI agents are better with the tool than I am:<p><pre><code> # What did my config look like before we broke it?
unf cat nginx.conf --at 1h | nginx -t -c /dev/stdin
# Grep through a deleted file
unf cat old-routes.rs --at 2d | grep "pub fn"
# Count how many lines changed in the last 10 minutes
unf diff --at 10m | grep '^[+-]' | wc -l
# Feed the last hour of changes to an AI for review
unf diff --at 1h | pbcopy
# Compare two points in time with your own diff tool
diff <(unf cat app.tsx --at 1h) <(unf cat app.tsx --at 5m)
# Restore just the .rs files that changed in the last 5 minutes
unf diff --at 5m --json | jq -r '.changes[].file' | grep '\.rs$' | xargs -I{} unf restore {} --at 5m
# Watch for changes in real time
watch -n5 'unf diff --at 30s'
</code></pre>
What was new for me: I came to Rust in Nov. 2025 honestly because of HN enthusiasm and some FOMO. No regrets. I enjoy the language enough that I'm now working on custom clippy lints to enforce functional programming practices. This project was also my first Apple-notarized DMG, my first Homebrew tap, and my second Tauri app (first one I've shared).<p>Install & Usage:<p><pre><code> > brew install cyrusradfar/unf/unfudged
</code></pre>
Then <i>unf watch</i> in a directory. <i>unf help</i> covers the details (or ask your agent to coach).<p>EDIT: Folks are asking for the source, if you're interested watch <a href="https://github.com/cyrusradfar/homebrew-unf" rel="nofollow">https://github.com/cyrusradfar/homebrew-unf</a> -- I'll migrate there if you want it.
Show HN: Unfucked - version all changes (by any tool) - local-first/source avail
I built <i>unf</i> after I pasted a prompt into the wrong agent terminal and it overwrote hours of hand-edits across a handful of files. Git couldn't help because I hadn't finished/committed my in progress work. I wanted something that recorded every save automatically so I could rewind to any point in time. I wanted to make it difficult for an agent to permanently screw anything up, even with an errant <i>rm -rf</i><p><i>unf</i> is a background daemon that watches directories you choose (via CLI) and snapshots every text file on save. It stores file contents in an object store, tracks metadata in SQLite, and gives you a CLI to query and restore any version. The install includes a UI, as well to explore the history through time.<p>The tool skips binaries and respects `.gitignore` if one exists. The interface borrows from git so it should feel familiar: <i>unf log</i>, <i>unf diff</i>, <i>unf restore</i>.<p>I say "UN-EF" vs U.N.F, but that's for y'all to decide: I started by calling the project Unfucked and got unfucked.ai, which if you know me and the messes I get myself into, is a fitting purchase.<p>The CLI command is `unf` and the Tauri desktop app is titled "Unfudged" (kids safe name).<p>How it works: <a href="https://unfucked.ai/tech" rel="nofollow">https://unfucked.ai/tech</a> (summary below)<p>The daemon uses FSEvents on macOS and inotify on Linux. When a file changes, `unf` hashes the content with BLAKE3 and checks whether that hash already exists in the object store — if it does, it just records a new metadata entry pointing to the existing blob. If not, it writes the blob and records the entry. Each snapshot is a row in SQLite. Restores read the blob back from the object store and overwrite the file, after taking a safety snapshot of the current state first (so restoring is itself reversible).<p>There are two processes. The core daemon does the real work of managing FSEvents/inotify subscriptions across multiple watched directories and writing snapshots. A sentinel watchdog supervises it, kept alive and aligned by launchd on macOS and systemd on Linux. If the daemon crashes, the sentinel respawns it and reconciles any drift between what you asked to watch and what's actually being watched. It was hard to build the second daemon because it felt like conceding that the core wasn't solid enough, but I didn't want to ship a tool that demanded perfection to deliver on the product promise, so the sentinel is the safety net.<p>Fingers crossed, I haven’t seen it crash in over a week of personal usage on my Mac. But, I don't want to trigger "works for me" trauma.<p>The part I like most: On the UI, I enjoy viewing files through time. You can select a time section and filter your projects on a histogram of activity. That has been invaluable in seeing what the agent was doing.<p>On the CLI, the commands are composable. Everything outputs to stdout so you can pipe it into whatever you want. I use these regularly and AI agents are better with the tool than I am:<p><pre><code> # What did my config look like before we broke it?
unf cat nginx.conf --at 1h | nginx -t -c /dev/stdin
# Grep through a deleted file
unf cat old-routes.rs --at 2d | grep "pub fn"
# Count how many lines changed in the last 10 minutes
unf diff --at 10m | grep '^[+-]' | wc -l
# Feed the last hour of changes to an AI for review
unf diff --at 1h | pbcopy
# Compare two points in time with your own diff tool
diff <(unf cat app.tsx --at 1h) <(unf cat app.tsx --at 5m)
# Restore just the .rs files that changed in the last 5 minutes
unf diff --at 5m --json | jq -r '.changes[].file' | grep '\.rs$' | xargs -I{} unf restore {} --at 5m
# Watch for changes in real time
watch -n5 'unf diff --at 30s'
</code></pre>
What was new for me: I came to Rust in Nov. 2025 honestly because of HN enthusiasm and some FOMO. No regrets. I enjoy the language enough that I'm now working on custom clippy lints to enforce functional programming practices. This project was also my first Apple-notarized DMG, my first Homebrew tap, and my second Tauri app (first one I've shared).<p>Install & Usage:<p><pre><code> > brew install cyrusradfar/unf/unfudged
</code></pre>
Then <i>unf watch</i> in a directory. <i>unf help</i> covers the details (or ask your agent to coach).<p>EDIT: Folks are asking for the source, if you're interested watch <a href="https://github.com/cyrusradfar/homebrew-unf" rel="nofollow">https://github.com/cyrusradfar/homebrew-unf</a> -- I'll migrate there if you want it.
Show HN: RetroTick – Run classic Windows EXEs in the browser
RetroTick parses PE/NE/MZ binaries, emulates an x86 CPU, and stubs enough Win32/Win16/DOS APIs to run classics like FreeCell, Minesweeper, Solitaire and QBasic, entirely in the browser. Built with Preact + Vite + TypeScript.<p>Demo: <a href="https://retrotick.com" rel="nofollow">https://retrotick.com</a><p>GitHub: <a href="https://github.com/lqs/retrotick" rel="nofollow">https://github.com/lqs/retrotick</a>