Most authors use the service for one paper a few times a year, so a
subscription does not fit. Add cheap one-time options (Paper pack, Extra
repository, Live updates, Extended expiration, Never expire), cap free
dated expiration at 5 months, keep cheaper subscriptions for heavy users,
and make every new conference a paid review package in three sizes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* 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>
- Overview: error-volume bars render (the fills were inline spans), the
cumulative users chart is scaled to its range and labels it, latencies
over a second read in seconds, and charts and daily numbers use the
accent instead of four unrelated colours.
- Labels, table headers and state chips drop the mono caps; queue stat
values drop the serif.
- Error rows keep their content aligned; row metadata wraps instead of
truncating every item; "1 term" is singular.
- Errors filter uses the shared segmented control; breadcrumbs include
Admin; user detail spaces its status and actions, uses the accent for
Generate and says when no access token is stored.
- The jobs table scrolls inside its card on phones.
- Mock server: admin fixtures for every admin endpoint (ADMIN=1).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The range picker drew a border around every segment inside the group's
border, and Drain used a filled pill that made the most destructive
action the loudest. Segments are now borderless inside one outline with
a tinted selection, all header controls share one height, and Drain and
Clear all use a red outline. Queue labels drop the mono caps. ADMIN=1
signs the mock server in as an administrator.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Explorer: redacted terms are highlighted in Markdown and code, the
sidebar shows when the link expires, "Download repository" is the one
primary action, and signed-out reviewers get a header without Sign in
or the source-code link.
- Status: a ready anonymization leads with a copyable share link; the
support links sit flat inside their section.
- One primary colour (accent) for actions and progress; mono is kept for
IDs, hashes and paths; settings are plain sections instead of cards.
- Font sizes snap to one scale (10-40px); rem values keep following the
reader's browser font size.
- Ko-fi button uses a dark surface in dark mode instead of a white pill.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- File-level errors keep the breadcrumb and repository actions; only
repository-level failures (no file list) hide the bar.
- Code wrapping follows the viewport when it crosses 992px.
- Settings and FAQ tables of contents stack at the same breakpoint as
their grids, so they no longer stay sticky over stacked content.
- The sign-in page keeps its 480px cap.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Wrap long code lines in the explorer below 992px; the declared
useWrapMode option was never applied.
- Light editor and gutter use the page colour, like dark mode.
- New anonymization uses the same 18px inset as other pages.
- Settings, new conference and FAQ section links scroll in one row
instead of wrapping under a lone underline.
- Page intros are no longer clamped to two lines.
- Status page actions stack full width without the anonymize form's
sticky bar styling; dropdown labels no longer split apart.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Explorer: 13px code, page-coloured dark editor, padded Markdown with a
readable width, full repository ID on hover, sidebar footer kept clear
of the floating Ko-fi button.
- Explorer errors render as a card with links home and to the FAQ; the
empty action bar and Raw/Download buttons are hidden.
- Unknown error codes show the generic message instead of the raw
ERRORS.<code> key.
- All app pages share one content column; New anonymization starts at
the top instead of floating mid-screen.
- Status page: spaced action buttons, aligned status pill, no second
Ko-fi embed under the support cards.
- Claim placeholders; consistent notebook option on new conferences.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The home page led with a text hero, a boxed stats strip, a numbered
how-it-works list, a trust card and three Bootstrap featurettes with
postage-stamp screenshots. It now shows the product first and stays
flat:
- Hero: copy on the left, the anonymize form in a browser frame on the
right, one primary CTA plus a link to a real anonymized repository,
and three reassurance points (free, read-only, expires).
- Proof and live stats collapse into hairline strips with no cards;
the stat bars keep their daily-delta charts and the "+N today" line.
- Before/after example gets a section head and shows the actual XXXX-n
masks, each labelled for screen readers.
- "What you get" is one large screenshot with three vertical tabs
(Anonymize, Review, Manage) instead of three columns. Tabs are real
buttons with tablist/tab/tabpanel roles, roving tabindex and arrow-key
navigation; the description and link sit outside the button. Signed-out
visitors are sent to sign in rather than to a dashboard that redirects.
- FAQ teaser with the three questions that come up most, linking into
the FAQ anchors.
- Phone layout: tabs become a strip above the screenshot with the
selected description below it, stats go two-up, panes stack, the CTA
fills the width, and horizontal overflow is clipped so the hero bleed
can never cause sideways scrolling.
Removes the dead how-it-works, trust, featurette and metrics styles and
the legacy mobile hero font overrides that fought the new sizes.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
"Report an issue" in the navbar read like a way to report an anonymized
repository, and it opened a blank GitHub issue instead of the template
that asks reporters to confirm the issue is about the service. The user
menu offered "Default settings" and "Logout" with no hint of what lives
behind them, and the Claim page was unreachable from any menu.
The settings page never loaded quotas (the bars stayed in their striped
loading state), mixed serif checkbox labels with sans forms, used
Bootstrap alert colours, and described options in jargon ("Proxy mode",
"Github page", "Line of code").
- Navbar: "Report a bug" links to the issue template with a tooltip that
names the service; the user menu shows who is signed in and lists
Settings, Claim an anonymization, Report a bug, Source code, Sign out,
each with a one-line hint. Icon links get aria-labels.
- Settings: quotas load through a shared quotaService (also used by the
dashboard); sections match the side navigation, which now follows
scrolling via a small paperScrollspy directive; copy explains each
option; account card with Sign out; delete moved into a danger zone;
Save shows Saving/Saved and the error alert uses the paper palette.
- Conferences list and detail: sort and status buttons show their state,
hidden statuses appear as chips with a count line, Remove is a button
behind a divider, dates spell the month, expiry column matches the
dashboard, detail page gets an Edit button and plan/cost meta.
- New conference: validation errors only appear after a field is touched
or the form submitted; pricing copy matches how price is computed.
- Status page: progress label no longer overlaps the details below it;
"Report a bug" points at the template and says whom it is for.
- Claim: single rule, constrained width, explains when to use it.
- Anonymize: shorter placeholder, consistent Auto-update label.
- Mock server gains the endpoints these pages need and an ANON mode.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The dashboard showed the anonymize date under "Expired", a dash in the
Expires column for 54 of 60 rows, raw status codes such as
branch_not_found, and a chip reading "REMOVED" that actually meant
"removed items are hidden". Muted text sat at 3.5:1 contrast, keyboard
focus was invisible, numbers were left-aligned, and a legacy record
without an identifier rendered as an empty link to /pr/undefined/.
This rewrites the dashboard template and controller and tightens the
theme tokens:
- Status sub-line is labelled ("anonymized on Sep 6, 2026"); Expires
shows Never, the date, or "Expired on <date>".
- Conference folded into the name cell as a tag; Views right-aligned;
every column header is a keyboard-sortable button with aria-sort.
- Sort/Status buttons show their state; chips read "Hiding Removed";
result count and Clear filters; empty state with a way out.
- Status filter covers Ready, In progress, Error, Expired, Removed.
Stuck downloads say so; codes map to sentences; statuses to labels.
- Lists load in parallel and merge once behind a skeleton; broken
records are flagged instead of linking nowhere.
- Actions menu: View, View page, Edit, Force update, divider, Remove,
all as buttons rather than href="#" anchors.
- Theme: warm dark canvas, muted text >= 4.5:1 in both modes, semantic
status tokens, 11/13/14/16px type scale, mono only for identifiers,
6px/10px/pill radii, :focus-visible ring, quota bars in ink until a
limit is near, unlimited shown as such.
- Mobile: no 9px text, filter row wraps in two lines, meta on one line.
Adds scripts/dev-mock.js to serve the dashboard with fixture data and
test/dashboard-ui.test.js covering the filters, template invariants and
token contrast.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The Conference cell is a grid item with the default min-width:auto,
so a long unbroken URL forces the grid track wider than its
minmax(140px, 1fr) size and bleeds visually into the Status column.
Clip it with overflow:hidden/ellipsis and expose the full value via
a title attribute.
* fix: dashboard menu clickability + expiration date UX
Dashboard actions menu:
- Inactive (expired/removed) rows dimmed via their cells instead of the
row, so `opacity` no longer creates a stacking context that trapped the
actions dropdown beneath later rows and made its items unclickable.
- Add an "Extend 6 months" menu item for expired repos/PRs/gists.
Expiration form (anonymize):
- Fix the "After , the content will be removed." blank date: guard the
helper text and add min/max validation feedback so an invalid pick no
longer nulls the model into a broken sentence.
- Add a `min` (today) so past dates can no longer be selected, and
compute min/max from local date parts (not UTC) to avoid a timezone
off-by-one in the native picker.
- Default expiration is now 6 months (single source of truth, removing a
latent double-offset bug); max stays at 1 year.
- Block submitting a missing/out-of-range expiration date.
Backend:
- New POST /:id/extend endpoint for repos, PRs and gists that pushes the
expiration +6 months and re-anonymizes so expired items come back
online, mirroring the refresh flow. Shared extendExpirationDate helper.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix: add frontend translation for invalid_status error code
The new /extend endpoints throw an "invalid_status" AnonymousError, which
the error-code coverage test requires to have a locale entry.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Floating button now initializes with theme-aware colors and updates
on toggle. Status page iframe uses a tuned CSS filter in dark mode
to blend with the warm palette.