Added
- Two-factor sign-in for local-password accounts: authenticator codes with
one-time recovery codes, which can be regenerated or turned off. Browser
sign-in, API-token exchange and sign-in email changes ask for the second
factor. Wrong codes back off from 30 seconds to an hour and lock after 100 in
a row, six-digit codes submit on their own, and Security warns when recovery
codes run low. Administrators can reset another user's factor after
reauthenticating; host operators can runsuchi auth reset-two-factorwith
the server stopped. - Native archive serial numbers. Suchi can assign them from QR labels, split a
feeder scan into one document per label, and keep the number across
replacement versions, filesystem sidecars and manifest-v3 takeouts. Edit it on
Document Detail and search it withasn:. Administrators set ASN mode, QR
prefix and scan-analysis DPI live under Advanced > Scan processing;
deployment-managed values are read-only. A rejected scan is explained on its
Upload row with the page and number, naming the document that already holds
the number when the uploader can open it. Demo corpus manifests can set
archive_serial_number. - Document dates you can act on. The Dashboard's Coming up card lists
accepted due, expiry and renewal dates for the next 30 days. Document Detail
lists a document's accepted dates with how far away they are and Add to
calendar. Exported.icsevents remind a day before a due date and a week
before an expiry or renewal. - Faster everyday work:
- Inbox rows offer a pending filing suggestion as a one-click button beside
File under…, applying the same decision as Approvals. - Filing, refiling and moving to Trash can be undone from a notice in the top
bar, or with ⌘ Z / Ctrl Z. Notices replace the dark toast at the
bottom of the screen and no longer cover the page. - The ⌘ K / Ctrl K menu finds documents and saved views as you type,
lists recently opened documents, and adds New view, Pair a phone,
Add a mailbox and Keyboard shortcuts commands. ? shows the
shortcuts anywhere outside a text field. - Search offers two example rich queries before the first search, and the
empty archive's getting-started card links to watched folders, mailboxes
and phone pairing.
- Inbox rows offer a pending filing suggestion as a one-click button beside
- Processing you can follow. A Processing N of M marker in the top bar shows
how far the current run has got; selecting it lists those documents with the
newis:processingquery term, and the list refreshes as each one finishes.
An open document that is still processing says so and refreshes when it
finishes. Upload re-checks its rows only when that status reports finished
work, replacing its own 2.5-second polling and "checks paused" state.
Processing issues name their documents, offer Retry all, and open
directly from the Dashboard's Failed jobs card. - The MCP adapter can list custom fields and set or clear a document's values,
so an agent can record an odometer reading or link a service invoice to its
purchase invoice. Writes use the existing checks for type, permission, Trash,
self-links and version history. - API additions:
/api/stats/returnsprocessing_readingand
processing_classifying; document details reportprocessing; job rows in
/api/tasks/carrydoc_title; filing, correspondent and tag suggestions
carryproposed_id; search hits carryjd_category_code; and
sources[].clientreportscompanion_appfor Suchi Companion uploads.
Changed
- Breaking: filing addresses now identify categories with exactly two
components. Introduced filing systems useSYS.AC(for exampleS01.21)
instead ofSYS.AC.documentID; the original single archive has no address
and shows the category code (21). The resolver rejects former
three-component values and returnsjd_category_id; Search and the ⌘ K menu
open the filtered Documents view, or search the text when no such category
exists.jd_addressand native-export values can repeat across documents,
while numeric IDs and URLs remain exact identity and default filenames keep an
independent__<documentID>suffix. API version 1, Companion v1, takeout
manifest 3, sidecar format 1 and privatesuchi-taxonomy/v1are unchanged.
This clean cutover provides no parser alias, schema, cached-receipt or
template rewrite, rendered-output sweep, fallback or maintenance command for
prior multi-system projections. - Filing chips: Dashboard, Documents, Search and Trash rows show the address (or
category code) and ASN as aligned blue chips that deepen on row hover or
keyboard focus. Document cards pair it with the category name, a
single-category Documents view or the Inbox leaves it out, and Document Detail
shows it beside the title instead of a read-only toolbar field with a copy
button. - Approvals use the shared workspace card, with tabs for All, Tags,
Filing, Fields, Dates, Decisions and, for administrators, a
right-aligned Processing issues. The open tab is kept in the address. Each
document is one block with its suggestions under the title; added tags read
+ tag, and Approve all / Dismiss all appear only when a document
has several suggestions. By suggestion opens a synchronized sidecar:
hovering or focusing one side highlights the matching items on the other,
decided items fade out of both, and each side shows at most 100 entries and
reports the rest. - Trash uses the shared workspace card, with the retention note and a counted
Empty trash in its header. Like Documents rows, each row opens its
document anywhere outside its controls, leads with the prior filing chip and
ends its metadata with the prior category name. A day countdown turns into an
amber pill in the final week; Restore comes first and permanent deletion
is a plain action. An empty Trash shows only Trash is empty. - Document Detail:
- a human-owned title shows Title pinned with Unpin, replacing the
lock icon, which now means only password status; - one Original row groups the file's name, plain format name (PDF, Word,
Email; the exact type on hover), size and file date, with other names it
arrived under folded beneath; - Added from shows one line per source, folding older mailbox folders, and
labels Suchi Companion uploads Suchi Companion · name, recognised by
the pairing token. Manually created tokens still read as API uploads.
- a human-owned title shows Title pinned with Unpin, replacing the
- Email attachments keep their own file name, which consumption-automation
filename filters match, and use the message'sDateas their created date so
filing paths sort by message date. The ingestion time stays the added date
and is the fallback whenDateis missing or invalid. - Saved decryption passwords show their label, last-used date and most recently
unlocked document in labeled columns; labels open for editing from the pencil
action. - Search is faster:
- common-word searches return about a quarter faster with unchanged results,
order and scores; - one- and two-character Chinese, Japanese, Korean and Thai terms check only
the documents left by the selected system, filters and permissions; - text search counts its matches in the query that ranks them;
- writing back an unchanged title and text no longer rewrites both search
indexes, while revision counters still advance.
- common-word searches return about a quarter faster with unchanged results,
Fixed
- Versioned filesystem sidecars validate and restore document sensitivity,
including sensitivity from native exports. Invalid sensitivity or a later
metadata failure leaves no partial intake; unversioned sidecars still ignore
fields outside their original flat shape. - Files that previously got no text now do:
- phone HEIC/HEIF photos are wrapped in JPEG-compressed PDF pages before OCR,
so a 24-megapixel iPhone photo no longer exceeds the 32 MiB conversion cap; - PDFs whose header follows a short prefix within the first 1024 bytes, such
as income-tax e-filing downloads and invoices beginning with a newline, are
processed as PDFs; - select affected photos and PDFs stored earlier and choose Rescan to
extract their text.
- phone HEIC/HEIF photos are wrapped in JPEG-compressed PDF pages before OCR,
- Watched-folder files with a known document extension keep that format even
when their first lines look like email headers. Bank.xlsexports beginning
Date : ...were stored as email and indexed nothing; extensionless Maildir
handoff names are still detected as email. - One format registry now drives MIME aliases, filename refinement, ingestion
routing and rendered or downloaded extensions. BMP, DjVu, Outlook, EPUB and
macro-enabled Office files keep the right extension, and DjVu reaches
djvutxt. Rendered files use the linked file's own extension (.pdffor the
searchable copy, otherwise the original's), so a plain-text upload no longer
appears asname__1.pdf; folder-layout templates that include an extension
are rejected. - A second Suchi process against the same archive fails immediately with
archive_in_useinstead of running independent writers against one SQLite
database. - Document-link writes with a fractional, negative or zero document ID are
rejected. A fractional ID previously rounded down to a different document, and
zero removed the link. - Deleting a folder layout that an automation still assigns is refused, naming
the rules to change, instead of leaving rules that fail on every new match. suchi gcremoves empty folders left inrendered/after documents move. The
dry run reports them;--applyremoves only empty folders.suchi exportsidecars carry custom-field values, so a reingested takeout
keeps typed values such as amounts and dates. Document-link values and
extraction-managedinvoice_*fields are left out; the latter are read again
from the original.- Query examples filter by imported document type with
tag:"type:invoice";
baretype:is not a query filter.
Security
- Build with Go 1.27.3 to include the standard-library
crypto/x509fix that
distrusts compromised intermediate certificates (GO-2026-6809), which mailbox
TLS connections rely on.
Verification
The release tag is signed with the public key pinned in the source tree:
./hack/verify-release-tag.sh v0.4.0Verify downloaded binaries and AnyDoc bundles:
sha256sum -c SHA256SUMS
cosign verify-blob \
--bundle SHA256SUMS.cosign.bundle \
--certificate-identity johnnybravo.xyz@protonmail.com \
--certificate-oidc-issuer https://github.com/login/oauth \
SHA256SUMSVerify the immutable container images:
cosign verify \
--certificate-identity johnnybravo.xyz@protonmail.com \
--certificate-oidc-issuer https://github.com/login/oauth \
ghcr.io/johnnybravo-xyz/suchi@sha256:64877e5304ba41512e849411d54a9cf77c120164f10fe9e5ef6e61646d4f90a3
cosign verify \
--certificate-identity johnnybravo.xyz@protonmail.com \
--certificate-oidc-issuer https://github.com/login/oauth \
ghcr.io/johnnybravo-xyz/suchi@sha256:d6d895d417ee8e20009d66082331d0ac5e9cfdd1200689a0b64d18d72f8efabf