v0.49.0 — /save keeps your feeds
/save was not carrying your feeds. SYNCED_FILES had feeds.opml in it, which is written by tcfeed rss add and, by its own comment, read by nothing in moshcode. /news and /rss keep their subscriptions in news.opml, which appeared in that allowlist zero times — and it is a strict allowlist, so nothing else picked it up. The two names sat one line apart, which is exactly why it looked handled: the feed list you actually built was the one thing /save left behind and /load never brought back. Both files travel now.
No size cap moved. A subscription list past the per-file cap is already reported as skipped rather than failing the snapshot, which is the right answer for a list that got big by importing somebody else's — /news add web3 is 611 feeds and will say so instead of breaking /save.
The other half is a list that was being maintained twice. The fourteen profullstack blogs were typed into DEFAULT_FEEDS by hand, duplicating a list already published at profullstack.com/feeds.opml. Two hand-maintained copies of one list is one more than can be kept in step, and the copy that goes stale is always the far one: nobody editing the published OPML has a reason to think about moshcode. That file is vendored now and parsed into the defaults, so there is one copy here instead of two. It is read synchronously at load, because a fresh install must not wait on the network before it shows anything, and it ships in both channels — files includes src, checked against npm pack. If it ever goes missing the defaults lose those fourteen entries rather than /news throwing.
Parsing it uses a small matcher rather than parseOpml, and a local copy of slugify, because news.mjs imports that module and taking the import back the other way makes a cycle. Neither shortcut is on the honour system: tests run the real parser and the real slugifier over the vendored file and require the same answers. Drift against the live URL is checked under MOSHCODE_CHECK_FEED_DRIFT=1, opt-in because a suite that fails whenever a website blinks is a suite people learn to ignore.
Full changelog: v0.48.0...v0.49.0