finds.dev← search

// the find

audreyt/ethercalc

★ 3,036 · TypeScript · NOASSERTION · updated Jul 2026

Node.js port of Multi-user SocialCalc

EtherCalc is a collaborative web spreadsheet built on the aging SocialCalc engine, now rewritten in TypeScript targeting Cloudflare Workers (Durable Objects + D1 + KV). The notable trick: it deploys to Cloudflare with wrangler or self-hosts offline via Docker — same codebase, no vendor lock-in required.

The dual-runtime story is genuinely well-executed: wrangler deploy to Cloudflare or docker compose up locally with persistent state, same binary, no special-casing. Most projects pick one and abandon the other. The Redis-to-Durable-Objects migration tooling is production-quality — one script handles dump, migrate, verify, and timestamped backup, not a pile of manual steps. Test discipline is real: 100% coverage targets plus Stryker mutation gates on the oracle-harness, migrate, and client packages; the oracle approach of recording scenarios against the legacy implementation then replaying against the rewrite is smart for preserving API parity. The nginx hardening docs include actual rate limit configs and TLS setup, not just 'put a reverse proxy in front.'

The core spreadsheet engine is still the original SocialCalc JavaScript from Socialtext under Artistic License 2.0 — over 15 years old and untouched. Multi-sheet support is just now being designed in packages/client-multi (plans dated June 2026), so this is still a single-sheet tool with a multi-sheet UI bolted on the side. Default security is anonymous write access to anyone who knows the room URL; ETHERCALC_KEY flips this, but it's opt-in and buried in the README environment table rather than front-and-center for anyone standing up a public instance. Requires Bun ≥ 1.1 for non-Docker paths, and the Apple Silicon networking quirk where curl localhost:8000 hangs against a healthy container is the kind of thing that wastes an hour in a CI environment. Legacy LiveScript sources in src/*.ls are still present 'until Phase 12 sweep,' which signals the rewrite is still mid-flight rather than settled.

View on GitHub → Homepage ↗

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →