* feat: let owners leave chosen files unredacted (#941)
Redacting self-citations in a bibliography reveals which papers are the
authors' own. Owners can now pick files whose content is served as
written; file names are still redacted. Patterns follow .gitignore rules.
The form gets a file picker fed by GitHub's tree API, and the terms box
grows with its content and only warns about regex symbols that can stop a
term from matching.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: honour !patterns, keep picked braces literal, preview unredacted README
- Patterns now apply in order and the last match wins, as in .gitignore,
so "*.bib" then "!private.bib" excludes private.bib instead of
preserving every other file.
- Picked paths escape glob characters, braces included, with a
backslash; "[{]" did not survive brace expansion.
- The README preview drops terms when the README is an unredacted file,
and refreshes when the list changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep rule order when deduplicating unredacted-file patterns
Rules apply in order and the last match wins, so dedupe keeps the last
copy of a repeated pattern instead of the first. The picker also keeps a
plain path in its place when it follows another rule, rather than moving
it to the front as a pick.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: apply unredacted-file rules to folders, as in .gitignore
A rule that matches a folder now covers every file inside it, so "*.bib"
then "!private" keeps private/refs.bib redacted. A trailing "/" limits a
rule to folders.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: folder unchecks win over broad rules; accept short commit hashes
- Unchecking a folder that a broader rule such as "*.bib" still covers
appends a "!/folder/" exclusion, so its files really go back to being
redacted.
- The tree endpoint accepts the 6+ character hashes the commit field
allows and resolves them to a full SHA before reading the tree.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: picker counts folder rules exactly as the server does
Rules ending in "/" stay patterns instead of being read as picked files,
and the checkboxes now run the saved rule list (picks, then patterns)
through the server's matcher, so the dialog cannot show files as
redacted that the server leaves unredacted.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: insert escaped terms literally in "Match as written"
String.replace expanded "$&", "$'" and "$1" in the term, so the fix
could corrupt the line. Splice by index instead.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
.paper-table hid overflow to keep its rounded corners, which cut off
row ⋯ menus on short lists (admin repositories, My work). Let the
container overflow and put the corner radius on the head and last row.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Go to line: themed popover under the file toolbar (line or line:column,
range check) instead of Ace's unthemed prompt
- Code selection: no per-box outline, so multi-line selections no longer
overlap at the joins; single-line matches keep an inset outline
- My work: copy-link is an icon button (URL in the tooltip); phone cards
drop the URL row and truncate long names
- Date fields: drop WebKit's native button styling so they fit their column
- Submit bar: the checkout note gets its own line under the button
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Admin errors: filters stack on phones (tabs, search, Sort and Group,
refresh) instead of squeezing into one row
- Admin overview: Summary / Performance / Cache views, kept in the URL
hash; charts take the full width on phones
- Phone menu: aligned rows with icons, neutral fill for the current page,
account links inline, no duplicate Sign in
- My work: removed and expired projects get a labelled badge, a muted
"Link offline" in place of the copy link, and an inline Enable/Extend
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Anonymize preview renders redactions as the viewer's numbered slots
- Code-block slots keep the width of XXXX-n and sit on the text line
- README no longer overflows on phones (grid forced two columns)
- Status bar always hides under the file header: no second Files button
or breadcrumb on repos with a website or for owners; Open website and
Edit anonymization move to the file menu
- Loading state no longer repeats the path visually
- Phone usage popover opens inside the screen
- Home closing band: no double divider, tighter gap above the footer
- File drawer closes after opening a file on phones
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Phone viewer: Contents menu for README headings, theme toggle in the header,
GitHub icon on sign-in, 12px Ace font
- File ⋯ menu: file details line, Find for HTML, View raw, Download ZIP,
Copy file path
- Redaction slots inside highlighted code blocks; fix regex lastIndex reuse
in the redaction walker
- Landing and FAQ copy: plainer headings, trust items, closing CTA band
- Explorer ZIP button label, snapshot text cleanup
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Backend, scripts, docs and their tests take main's newer code where both
sides changed the same lines (the shared blob cache, GitHubStream and
markdown fixes landed on main after the Go migration branch was cut).
The Dockerfile keeps the Go build from the migration, plus main's
owner-alert-protocol label; .gitignore keeps both sides' entries.
Frontend keeps the redesign and folds in main's features: Stripe billing
in the New anonymization submit bar, GitHub access repair, redaction
syntax help, the preview expand toggle, configurable redaction mask,
folder counts, reviewer-route header rules, link expiry (now in the
viewer's snapshot details) and the explorer error card. main's
narrow-only wrap logic is dropped because the redesign wraps on desktop
and scrolls sideways on phones.
Tests: 1534 passing with SESSION_SECRET set (as in CI). Three main tests
were updated for the agreed viewer design (no site header in the viewer,
no repository-wide file count).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One-row phone toolbar, errors page opens on server errors, one-row submit
bar, publish warning after a source loads, three-column FAQ with a help
card, queue range control in the Throughput card, shared admin table cards,
dark-mode contrast and a stronger phone code scroll cue.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Viewer: full-height app bar with a Help menu, search + ZIP sidebar, one
toolbar for README and code, reading mode with a scroll-tracking outline,
docked find for Markdown and code, and redaction slots (a blank stone slot
holding the term number) in prose, headings, code, the tree and the path.
Landing and FAQ: live redaction demo, serif display headings, teal accent.
Author screens: My work table with copy/open/edit actions, a usage meter,
a single-container New anonymization flow with a sticky submit bar, themed
form controls, and consistent GitHub connection cards.
Admin: underline tabs, severity-first errors chart and list, error tiles
that filter (older pages load until matches appear), queue and overview
health states, and shared toolbar heights and borders.
Fixes: guarded localStorage access, failed README images render a
placeholder, phone hover states no longer stick, and UI tests updated for
the new copy and markup.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>