Files
anonymous_github/public/partials/home.htm
T
Thomas DurieuxandClaude Opus 5.5 9872cace5e feat(ui): polish from design review rounds 92-121
- 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>
2026-11-08 18:14:47 +00:00

273 lines
15 KiB
HTML

<div class="paper-landing">
<!-- Hero: copy on the left, the product on the right -->
<section class="paper-hero">
<div class="paper-hero-copy">
<div class="paper-eyebrow">For double-blind peer review</div>
<h1 class="hero-title">
Share the code,<br>
<span class="accent">not the author.</span>
</h1>
<p class="hero-subtitle">
Anonymous GitHub makes a read-only mirror of your repository, pull
request, or gist. It redacts the terms you choose in text files,
so reviewers can browse your artifact through an anonymous link.
</p>
<div class="paper-cta-row">
<a href="/signin" target="_self" class="btn-hero" v-if="!user">
<i class="fab fa-github mr-2" aria-hidden="true"></i>Sign in with GitHub
</a>
<a href="/anonymize" class="btn-hero" v-if="user">
Anonymize a repository &rarr;
</a>
<a class="paper-link-arrow" target="_self" href="https://anonymous.4open.science/r/840c8c57-3c32-451e-bf12-0e20be300389/">See an anonymized repository &rarr;</a>
</div>
<ul class="paper-reassure">
<li>Free, open source</li>
<li>Read-only access</li>
<li>Set an expiry date</li>
</ul>
</div>
<div class="paper-hero-shot">
<div class="paper-frame">
<div class="paper-frame-bar" aria-hidden="true">
<span class="dots"><i></i><i></i><i></i></span>
<span class="url">anonymous.4open.science/r/paper-7f2a</span>
</div>
<div class="hero-mock" role="img" aria-label="A reviewer browsing an anonymized repository: the author, affiliation, and email in the README are replaced by anonymous terms">
<div class="hero-mock-tree" aria-hidden="true">
<div class="hero-mock-tree-title">Files</div>
<div class="hero-mock-row is-folder"><svg viewBox="0 0 16 16"><path d="M1.5 3.5h4l1.5 1.5h7.5v8h-13z"/></svg>data</div>
<div class="hero-mock-row is-folder"><svg viewBox="0 0 16 16"><path d="M1.5 3.5h4l1.5 1.5h7.5v8h-13z"/></svg>experiments</div>
<div class="hero-mock-row is-folder"><svg viewBox="0 0 16 16"><path d="M1.5 3.5h4l1.5 1.5h7.5v8h-13z"/></svg>src</div>
<div class="hero-mock-row"><svg viewBox="0 0 16 16"><path d="M3.5 1.5h6l3 3v10h-9z"/></svg>LICENSE</div>
<div class="hero-mock-row is-active"><svg viewBox="0 0 16 16"><path d="M3.5 1.5h6l3 3v10h-9z"/></svg>README.md</div>
<div class="hero-mock-row"><svg viewBox="0 0 16 16"><path d="M3.5 1.5h6l3 3v10h-9z"/></svg>requirements.txt</div>
</div>
<div class="hero-mock-doc" aria-hidden="true">
<div class="hero-mock-doc-bar"><strong>README.md</strong><span class="hero-mock-count">3 redacted</span></div>
<div class="hero-mock-doc-body">
<div class="hero-mock-h1">DeepLearnUtils</div>
<p>Developed by <span class="redact" role="img" aria-label="Redacted term 1"><i>1</i></span> at <span class="redact" role="img" aria-label="Redacted term 2"><i>2</i></span>.</p>
<p>Utilities for reproducing the paper&rsquo;s experiments.</p>
<div class="hero-mock-h2">Quick start</div>
<pre>pip install -r requirements.txt
python experiments/run.py</pre>
<p>Contact: <span class="redact" role="img" aria-label="Redacted term 3"><i>3</i></span></p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Live stats -->
<section class="paper-stats paper-wrap" id="metrics" aria-label="Usage over the last 60 days">
<div class="paper-stats-meta">
<div class="paper-stats-meta-left"><span class="paper-stats-dot" aria-hidden="true"></span> Live &middot; last 60 days &middot; updated daily</div>
<div class="paper-stats-meta-right">Used by authors at ICSE &middot; FSE &middot; OOPSLA</div>
</div>
<div class="paper-stats-grid">
<div class="paper-stat-card" v-for="(card, index) in cards" :key="card?.key">
<div class="paper-stat-value" :class="{ 'is-pending': !stat }">{{ stat ? fmt?.bigNum(card?.total) : '—' }}</div>
<div class="paper-stat-label">{{ card?.label }}</div>
<div class="paper-stat-delta" v-if="history[card?.key].bars?.length &gt; 1">
+{{ fmt?.number(history[card?.key].deltaToday) }} today
</div>
</div>
</div>
</section>
<!-- Before / after -->
<section class="paper-section-head paper-wrap">
<div>
<div class="paper-eyebrow">Try it</div>
<h2>The same repository, <em>minus you.</em></h2>
</div>
<p>
Names, affiliations, emails, and any term you list are replaced across
the README, source files, notebooks, and PDF links. Reviewers browse the
real thing, not a zip.
</p>
</section>
<div class="demo paper-wrap" aria-label="Try redaction">
<div class="demo-terms">
<label for="demo-terms">Terms to redact <span>comma-separated, try adding your own</span></label>
<input id="demo-terms" type="text" v-model="demoTerms" spellcheck="false" autocomplete="off">
</div>
<div class="demo-panes">
<div class="pane">
<div class="pane-header"><span class="pane-label">Your repository <span class="pane-edit-hint">· editable</span></span><span class="pane-url">github.com/jane-smith/DeepLearnUtils</span></div>
<div class="demo-input-wrap">
<div class="pane-body demo-backdrop" aria-hidden="true"><template v-for="(p, i) in demoParts()" :key="i"><mark v-if="p.redacted" class="demo-match">{{ p.original }}</mark><template v-else>{{ p.text }}</template></template>&#8203;</div>
<textarea class="pane-body demo-input" v-model="demoText" spellcheck="false" aria-label="Sample README to anonymize"></textarea>
</div>
</div>
<div class="pane pane-after">
<div class="pane-header"><span class="pane-label">What reviewers see</span><span class="pane-url"><span class="meta-redact">{{ demoCount() }} redacted</span></span></div>
<div class="pane-body demo-output" aria-live="polite"><template v-for="(p, i) in demoParts()" :key="i"><span v-if="p.redacted" class="redact-chip" :title="'Replaces “' + p.original + '”'">{{ p.text }}</span><template v-else>{{ p.text }}</template></template></div>
</div>
</div>
</div>
<!-- What you get: one screenshot, three tabs -->
<section class="paper-section-head paper-wrap" id="about">
<div>
<div class="paper-eyebrow">What you get</div>
<h2>Anonymize, review, manage.</h2>
</div>
<p>
Terms are redacted in text files. Enabled images and PDFs are served
unchanged, so review them for identifying content before sharing.
Monitor your mirror, update it, or remove it when the review is over.
</p>
</section>
<section class="paper-features paper-wrap" aria-label="Product features">
<div class="paper-features-list" role="tablist" aria-label="Features" aria-orientation="vertical">
<div class="paper-feature" v-for="(f, index) in features" :key="f?.key" :class="{&#x27;is-on&#x27;: feature === f?.key}">
<button type="button" class="paper-feature-tab" role="tab" @click="selectFeature(f.key)" @keydown="featureKeydown($event, index)" :id="&quot;feature-tab-&quot; + (f?.key)" :aria-controls="&quot;feature-panel-&quot; + (f?.key)" :aria-selected="(feature === f?.key)" :tabindex="(feature === f?.key ? 0 : -1)">
<span class="paper-eyebrow">{{ f?.num }} &middot; {{ f?.eyebrow }}</span>
<span class="paper-feature-title">{{ f?.title }} {{ f?.accent }}</span>
</button>
<div class="paper-feature-more">
<span class="paper-feature-title paper-feature-title-m" aria-hidden="true">{{ f?.title }} {{ f?.accent }}</span>
<p>{{ f?.text }}</p>
<a class="paper-link-arrow" :href="safeUrl((featureHref(f)))" :target="(featureTarget(f))">{{ f?.cta }} &rarr;</a>
</div>
</div>
</div>
<div class="paper-features-stage">
<div class="paper-feature-panel" role="tabpanel" v-for="(f, index) in features" :key="f?.key" v-show="feature === f?.key" :id="&quot;feature-panel-&quot; + (f?.key)" :aria-labelledby="&quot;feature-tab-&quot; + (f?.key)">
<div class="paper-frame">
<div class="paper-frame-bar" aria-hidden="true">
<span class="dots"><i></i><i></i><i></i></span>
<span class="url">{{ f?.url }}</span>
</div>
<div class="feat-mock" :class="'is-' + f?.key" role="img" :aria-label="(f?.alt)">
<template v-if="f?.key === 'anonymize'">
<div class="fm-form">
<div class="fm-label">GitHub repository</div>
<div class="fm-input">github.com/jane-smith/DeepLearnUtils</div>
<div class="fm-label">Terms to redact</div>
<div class="fm-chips"><span>Jane Smith</span><span>MIT CSAIL</span><span>jane.smith@mit.edu</span><span class="fm-chip-add">+ Add term</span></div>
<div class="fm-row">
<div><div class="fm-label">Reviewers can see</div><div class="fm-toggles"><span class="is-on">Images</span><span class="is-on">PDFs</span><span>Links</span><span class="is-on">Notebooks</span></div></div>
<div><div class="fm-label">Expires</div><div class="fm-input fm-input-sm">Mar 31, 2027</div></div>
</div>
<div class="fm-actions"><span class="fm-share">anonymous.4open.science/r/paper-7f2a</span><span class="fm-btn">Anonymize repository</span></div>
</div>
</template>
<template v-else-if="f?.key === 'review'">
<div class="fm-viewer">
<div class="fm-tree"><div class="is-folder">data</div><div class="is-folder">src</div><div class="is-file is-active">train.py</div><div class="is-file">README.md</div><div class="is-file">LICENSE</div></div>
<div class="fm-code">
<div class="fm-code-bar"><span><b>train.py</b></span><span>48 lines · Python</span></div>
<pre><span class="ln">1</span><span class="c"># Training loop for DeepLearnUtils</span>
<span class="ln">2</span><span class="c"># Author: <span class="redact">XXXX-1</span>, <span class="redact">XXXX-2</span></span>
<span class="ln">3</span><span class="k">import</span> torch
<span class="ln">4</span><span class="k">from</span> utils <span class="k">import</span> load_config
<span class="ln">5</span>
<span class="ln">6</span><span class="k">def</span> <span class="f">train</span>(config):
<span class="ln">7</span> model = build_model(config)
<span class="ln">8</span> <span class="k">for</span> epoch <span class="k">in</span> range(config.epochs):
<span class="ln">9</span> loss = step(model)
<span class="ln">10</span> log(<span class="s">"epoch %d: %.3f"</span>, epoch, loss)</pre>
</div>
</div>
</template>
<template v-else>
<div class="fm-dash">
<div class="fm-dash-head"><span>Project</span><span>Status</span><span>Views</span><span>Expires</span></div>
<div class="fm-dash-row"><span><b>DeepLearnUtils</b><i>paper-7f2a · ICSE 2027</i></span><span class="st is-ready">Ready</span><span>41</span><span>Mar 31, 2027</span></div>
<div class="fm-dash-row"><span><b>vision-bench#212</b><i>pull request · FSE 2027</i></span><span class="st is-ready">Ready</span><span>12</span><span>Never</span></div>
<div class="fm-dash-row"><span><b>graph-repair</b><i>gr-91ab</i></span><span class="st is-progress">Updating</span><span>5</span><span>Jan 5, 2027</span></div>
<div class="fm-dash-row is-muted"><span><b>JarSift</b><i>OOPSLA 2025</i></span><span class="st is-expired">Expired</span><span>72</span><span>Sep 28, 2026</span></div>
</div>
</template>
</div>
</div>
</div>
</div>
</section>
<!-- FAQ teaser -->
<section class="paper-qa paper-wrap" aria-labelledby="qa-heading">
<div>
<div class="paper-eyebrow">Before you sign in</div>
<h2 id="qa-heading">The questions that come up most.</h2>
<a class="paper-link-arrow" href="/faq">Read the full FAQ &rarr;</a>
</div>
<div>
<div class="q">
<a href="/faq#permissions">What access does GitHub sign-in require?</a>
<p>
The GitHub App has read-only access to gists and the repositories you choose.
Legacy OAuth uses broader permissions.
Anonymous GitHub never writes to your repositories.
</p>
</div>
<div class="q">
<a href="/faq#formats">Which file formats are supported?</a>
<p>
Source code with syntax highlighting, Markdown, Jupyter notebooks,
PDFs, images, and GitHub Pages sites. Text files are anonymized;
enabled images and PDFs are served unchanged.
</p>
</div>
<div class="q">
<a href="/faq#expiration">What happens when an anonymized repository expires?</a>
<p>
You choose: the mirror is removed, or visitors are redirected to the
original GitHub repository once the review is over.
</p>
</div>
</div>
</section>
<section class="paper-cta paper-wrap" aria-labelledby="cta-heading">
<div>
<h2 id="cta-heading">Ready for review?</h2>
<p>Create an anonymous mirror in a couple of minutes. Reviewers just open the link.</p>
</div>
<div class="paper-cta-actions">
<a class="btn-hero" href="/signin" target="_self"><i class="fab fa-github" aria-hidden="true"></i> Sign in with GitHub</a>
<a class="paper-link-arrow" href="/faq">Read the FAQ &rarr;</a>
</div>
</section>
<footer class="paper-footer">
<div class="paper-footer-inner">
<div class="paper-footer-brand">
<div class="paper-footer-mark">Anonymous <em>GitHub</em></div>
<p class="paper-footer-tag">
A read-only, identity-stripped mirror of your repository, built for
double-anonymous peer review.
</p>
</div>
<div class="paper-footer-col">
<div class="paper-footer-head">Product</div>
<a href="/anonymize">Anonymize</a>
<a href="/dashboard" v-if="user">My work</a>
<a href="/conferences" v-if="user">Conferences</a>
<a href="/faq">FAQ</a>
</div>
<div class="paper-footer-col">
<div class="paper-footer-head">Project</div>
<a href="https://github.com/tdurieux/anonymous_github/" target="_blank" rel="noopener">Source code</a>
<a href="https://github.com/tdurieux/anonymous_github/issues/new?template=issue_report.yml" target="_blank" rel="noopener">Report a bug</a>
<a href="https://github.com/sponsors/tdurieux/" target="_blank" rel="noopener">Support</a>
</div>
<div class="paper-footer-col">
<div class="paper-footer-head">Contact</div>
<a href="mailto:tdurieux@anonymous.4open.science">Email maintainer</a>
<a href="https://github.com/tdurieux" target="_blank" rel="noopener">@tdurieux</a>
</div>
</div>
<div class="paper-footer-rule"></div>
<div class="paper-footer-foot">
<span>&copy; {{ year || 2026 }} Anonymous GitHub &middot; GPL-3.0 licensed</span>
<span class="paper-footer-meta">Built for reviewers, by researchers.</span>
</div>
</footer>
</div>