Files
accounted/registry
Mattsson 4a9fa5e6c5 feat(inbox): staged upload ack, HEIC/HEIF validation, WhatsApp silence fixes (#1605)
* fix(whatsapp): app-side unmute, close silent intake paths, health visibility

- add POST /link/unmute and a Reactivate control on the Pausad state
- company resolution: transient query errors release the row for sweep
  retry; genuine zero-options sends M19 instead of parking silently
- media from unlinked senders bypasses the hourly greeting throttle
  (10 min burst window, daily cap kept)
- GET /link returns 7-day failed-delivery and parked-inbound counts;
  sweep summary logs outboundFailed24h

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(documents): real HEIC/HEIF magic-byte validation, bilingual upload errors

- detect ISO-BMFF ftyp brands (heic/heix/heim/heis/hevc/hevx/hevm/hevs,
  mif1/msf1) instead of exempting image/heic from validation; declared
  heic/heif accepts either family member (iOS labels vary)
- new INBOX_UPLOAD_* structured error codes replace raw English strings
  on the inbox upload and attach-document routes
- registry doc corrected to the real 10 MB cap

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(inbox): staged upload with instant ack and deferred AI extraction

- web uploads insert the inbox item as status processing and respond
  immediately; Bedrock extraction and supplier match run via after()
  with a CAS flip to received (email and WhatsApp channels keep the
  synchronous path)
- widen invoice_inbox_items.status CHECK to include processing
  (migration 20260813180000, pg-real test included)
- crash-recovery sweep cron (*/2) flips stale processing rows;
  bulk-book skips extraction_in_progress items
- workspace: processing chip, in-flight rows disable actions, realtime
  flip, retry-extraction button for empty extractions
- picker accept list drops HEIC/HEIF so iOS transcodes library photos
  to JPEG; server allowlists unchanged (supersedes 2026-08-01 HEIC
  decision, see DECISIONS.md)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(migrations): bump inbox processing-status migration past main's latest

Main merged 20260813210000 while this PR was in flight; an inserted
version older than the latest applied aborts the prod db push at merge.
Renamed 20260813180000 to 20260813213000 and updated references.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(decisions): log preview-tracker orphan repair after migration rename

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 23:57:53 +02:00
..

Community Registry

This directory is the source of truth for the registry shown at gnubok.se/community/registry: skills, MCP servers, workflows and apps built on Accounted. The website syncs its registry pages from here, so adding an entry is a normal pull request against this repo.

Structure

registry/
  entries/   one .mdx file per registry entry
  authors/   one .mdx file per author profile

Files starting with _ are templates and are ignored by validation and sync.

Adding an entry

  1. Copy entries/_template.mdx to entries/<your-slug>.mdx. The filename is the slug and the public URL: gnubok.se/community/registry/<your-slug>.
  2. If this is your first contribution, copy authors/_template.mdx to authors/<your-handle>.mdx. The author field in your entry must match an author file, so first-time contributors add both files in the same PR.
  3. Validate locally: npm run validate:registry (or npx tsx scripts/validate-registry.ts without installing everything).
  4. Open a PR. Commits need a DCO sign-off (git commit -s), same as the rest of the repo; see CONTRIBUTING.md.

A maintainer reviews the entry (does it work, does it describe itself honestly, is the content safe) and merges. After merge the website pulls the entry in with its registry sync; expect it live on the site within a few days of merging.

Entry frontmatter

Required:

Field Type Notes
title string Shown as the card and page title
description string Card subtitle, max 500 chars; put detail in the body
slug string Must equal the filename
kind skill | mcp | workflow | app Which shelf it goes on
author string Handle of a file in authors/
status live | beta | archived Be honest; beta is fine
lang sv | en Language of the entry body
personas list Any of founder, finance, byra, developer
publishedAt date YYYY-MM-DD
updatedAt date YYYY-MM-DD, bump when you edit

At least one of installCommand, downloadUrl, repoUrl, externalUrl is required so readers can actually get the thing. Optional extras: featured (maintainer-set), oauthScopes, gnubokTools (which MCP tools it touches), requiresWriteScope, sieCompatible, version, faq (list of {q, a}), related (list of slugs), ogImageEyebrow.

Body rules

The body after the frontmatter is plain Markdown (headings, lists, tables, links, fenced code blocks). The website renders bodies through MDX, which evaluates raw tags (lowercase HTML included), {...} expressions and import/export statements at build time, so the validator rejects all of them. Fenced code blocks and backtick inline code are fine; they are displayed, never executed. Need a literal <tag> or {value} in prose? Put it in backticks.

Write the body like documentation, not a landing page: what it does, what it needs (scopes, API keys), what it will not do, and one honest limitation beats three superlatives.

What gets accepted

  • It must exist and work against Accounted today (the live app or the MCP server).
  • It must describe its write behavior truthfully. Anything that writes to the ledger goes through staged operations that a human approves; entries that work around that will not be listed.
  • No fees are charged for listing, and your IP stays yours. Entries are documentation and are contributed under this repo's license; the thing the entry points to keeps whatever license you gave it.