mirror of
https://github.com/tdurieux/anonymous_github.git
synced 2026-11-14 08:17:26 +01:00
- 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>
273 lines
15 KiB
HTML
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 →
|
|
</a>
|
|
<a class="paper-link-arrow" target="_self" href="https://anonymous.4open.science/r/840c8c57-3c32-451e-bf12-0e20be300389/">See an anonymized repository →</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’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 · last 60 days · updated daily</div>
|
|
<div class="paper-stats-meta-right">Used by authors at ICSE · FSE · 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 > 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>​</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="{'is-on': feature === f?.key}">
|
|
<button type="button" class="paper-feature-tab" role="tab" @click="selectFeature(f.key)" @keydown="featureKeydown($event, index)" :id=""feature-tab-" + (f?.key)" :aria-controls=""feature-panel-" + (f?.key)" :aria-selected="(feature === f?.key)" :tabindex="(feature === f?.key ? 0 : -1)">
|
|
<span class="paper-eyebrow">{{ f?.num }} · {{ 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 }} →</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=""feature-panel-" + (f?.key)" :aria-labelledby=""feature-tab-" + (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 →</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 →</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>© {{ year || 2026 }} Anonymous GitHub · GPL-3.0 licensed</span>
|
|
<span class="paper-footer-meta">Built for reviewers, by researchers.</span>
|
|
</div>
|
|
</footer>
|
|
</div>
|