Skip to content
This repository was archived by the owner on Aug 7, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 18 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,23 @@
<h1 align="center">rumcodecs</h1>

<p align="center">
<a href="https://github.com/fideus-labs/rumcodecs/actions/workflows/ci.yml"><img src="https://github.com/fideus-labs/rumcodecs/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
<a href="https://github.com/fideus-labs/rumcodecs/actions/workflows/rust-ci.yml"><img src="https://github.com/fideus-labs/rumcodecs/actions/workflows/rust-ci.yml/badge.svg" alt="Rust CI" /></a>
<img src="https://img.shields.io/badge/status-retired-lightgrey.svg" alt="Retired" />
<a href="https://www.npmjs.com/package/@fideus-labs/rumcodecs"><img src="https://img.shields.io/npm/v/%40fideus-labs%2Frumcodecs" alt="npm" /></a>
<a href="LICENSE.txt"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License" /></a>
</p>

> [!WARNING]
> **This project is retired.** rumcodecs was an experiment: could numcodecs.js
> be reimplemented in Rust/WASM without breaking its API or its byte formats?
> It could, and that is as far as the experiment goes. The project is no longer
> maintained.
>
> The published package stays on npm and keeps working, but it is deprecated:
> expect no further releases, no bug fixes, no security updates, and no support.
> Use [numcodecs.js](https://github.com/manzt/numcodecs.js) for anything real.
> The code below is left as it was — read it, fork it, take what is useful
> (MIT).

<p align="center">
<strong>numcodecs.js reimplemented in Rust.</strong>
</p>
Expand Down Expand Up @@ -129,10 +140,11 @@ rumcodecs/

## 🤝 Contributing

Start with [AGENTS.md](AGENTS.md) for the repository map and conventions, and
the [open issues](https://github.com/fideus-labs/rumcodecs/issues) for what to
pick up next. All participation is governed by our
[Code of Conduct](CODE_OF_CONDUCT.md).
Nothing to contribute to — the project is retired, and issues and pull requests
are no longer being reviewed or merged. Forking is the way forward: the MIT
license covers everything here, and [AGENTS.md](AGENTS.md) still has the
repository map and conventions if you want to pick the code up. Anyone still
interacting here is governed by our [Code of Conduct](CODE_OF_CONDUCT.md).

## 📄 License

Expand Down
10 changes: 7 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
{
"name": "@fideus-labs/rumcodecs",
"version": "0.1.1",
"description": "Buffer compression and transformation codecs — Rust/WASM reimplementation of numcodecs using blusc",
"version": "0.1.2",
"description": "[RETIRED — experiment, unmaintained] Buffer compression and transformation codecs — Rust/WASM reimplementation of numcodecs using blusc",
"keywords": [
"blosc",
"codecs",
"compression",
"deprecated",
"retired",
"rust",
"unmaintained",
"wasm",
"zarr"
],
Expand Down Expand Up @@ -76,5 +79,6 @@
"engines": {
"node": ">=18.0.0"
},
"packageManager": "pnpm@11.20.0"
"packageManager": "pnpm@11.20.0",
"deprecated": "rumcodecs was an experiment and is retired — unmaintained, with no further releases, fixes, or security updates. Use numcodecs (https://github.com/manzt/numcodecs.js) instead."
}
73 changes: 73 additions & 0 deletions test/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,76 @@ describe("rumcodecs exports", () => {
expect(entries.index).toMatch(/src\/index\.ts$/);
});
});

// rumcodecs is retired. The notice lives in two files that reach different
// audiences — package.json feeds the npm search result and the package page,
// README.md is what GitHub and that same page render — and nothing but these
// assertions keeps them agreeing. A routine `npm version` bump or a docs edit
// can drop one side, and the result is a package that announces itself as
// retired in one place and as maintained in the other, which nobody notices
// until it is published.
//
// None of this is what makes `npm install` print a deprecation warning: that
// flag lives in the registry and is set by `npm deprecate`, out of this
// repository's reach. The `deprecated` field below is a marker for readers and
// tooling, so the intent survives in version control rather than existing only
// as registry state someone has to remember to reapply.
describe("retirement notice", () => {
const readme = readFileSync(new URL("../README.md", import.meta.url), "utf8");

// The callout runs from the marker to the first line that leaves the
// blockquote. Slicing to a fixed trailing string instead degrades silently:
// indexOf returns -1 when it moves, slice(0, -1) then hands back nearly the
// whole README, and "the link is inside the callout" starts passing on a link
// that is nowhere near it.
const calloutStart = readme.indexOf("> [!WARNING]");
const calloutBody = (() => {
if (calloutStart === -1) return "";
const lines = readme.slice(calloutStart).split("\n");
const end = lines.findIndex((line, i) => i > 0 && !line.startsWith(">"));
return (end === -1 ? lines : lines.slice(0, end)).join("\n");
})();

it("package.json carries a deprecation message", () => {
expect(typeof pkg.deprecated).toBe("string");
expect(pkg.deprecated.trim()).not.toBe("");
});

// A deprecation notice that does not say what to use instead makes the reader
// do the search themselves, so the replacement is part of the contract.
it("the deprecation message names the replacement", () => {
expect(pkg.deprecated).toMatch(/numcodecs/);
});

it("the npm description marks the package retired", () => {
expect(pkg.description).toMatch(/retired/i);
});

it("the keywords mark the package retired", () => {
expect(pkg.keywords).toContain("retired");
expect(pkg.keywords).toContain("deprecated");
});

it("the README leads with a retirement callout", () => {
expect(calloutStart).toBeGreaterThan(-1);
expect(calloutBody).toMatch(/retired/i);
});

// Both files should point at the same escape hatch. Matching the link rather
// than the bare name, and only inside the callout: the name "numcodecs.js"
// occurs in the callout's own opening sentence and throughout the prose
// below, so anything looser still passes on a callout that strands the reader
// with "this is retired" and nowhere to click.
it("the README callout links to the replacement named in package.json", () => {
expect(calloutBody).toMatch(/\[numcodecs\.js\]\(https:\/\/github\.com\/manzt\/numcodecs\.js\)/);
});

// The callout is only useful above the fold. Sinking it below the codec table
// or the quick start means the reader has already started integrating.
it("the README callout precedes the usage docs", () => {
const quickStart = readme.indexOf("Quick start");
expect(calloutStart).toBeGreaterThan(-1);
expect(quickStart).toBeGreaterThan(-1);
expect(calloutStart).toBeLessThan(quickStart);
});
});