mirror of
https://github.com/tdurieux/anonymous_github.git
synced 2026-11-14 00:07:00 +01:00
The UI was uneven: the home page looked finished, but app pages used three different display typefaces, the anonymize flow changed frame between steps, and the dashboard, explorer and admin screens each had their own controls, status colours and edge-case handling. Make every screen follow one system: shared page header, grid, buttons, filters and status colours; a repository picker and step trail on anonymize; a "What reviewers will see" preview of the actual reviewer page; consistent file headers and viewers for every file type; truthful admin charts and tables. Fold the accumulated override blocks back into style.css (22% smaller, no visual change). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
243 lines
15 KiB
HTML
243 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-anonymous 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>
|
|
<p class="paper-proof-mobile">Used by authors at ICSE · FSE · OOPSLA</p>
|
|
</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 class="hm-opt">Utilities for reproducing the paper’s experiments.</p>
|
|
<div class="hero-mock-h2 hm-opt">Quick start</div>
|
|
<pre class="hm-opt">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" :class="{ 'is-empty': statsEmpty() }">
|
|
<div class="paper-stats-meta">
|
|
<div class="paper-stats-meta-left" v-if="!statsEmpty()"><span class="paper-stats-dot" aria-hidden="true"></span> <span>Live · last 60 days<span class="paper-stats-daily"> · updated daily</span></span></div>
|
|
<div class="paper-stats-meta-right">Used by authors at ICSE · FSE · OOPSLA</div>
|
|
</div>
|
|
<div class="paper-stats-grid" v-if="!statsEmpty()">
|
|
<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 && history[card?.key].deltaToday > 0">
|
|
+{{ 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<span class="dt-try">, try adding your own</span></span></label>
|
|
<textarea id="demo-terms" class="demo-terms-input" rows="1" v-model="demoTerms" spellcheck="false" autocomplete="off" @keydown.enter.prevent></textarea>
|
|
</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"><span class="pf-num">{{ f?.num }}</span><span class="pf-sep"> · </span><span class="pf-name">{{ f?.eyebrow }}</span></span>
|
|
<span class="paper-feature-title">{{ f?.title.split('-')[0] }}<span class="serif-hy" v-if="f?.title.includes('-')">-</span>{{ f?.title.split('-').slice(1).join('-') }} {{ f?.accent }}</span>
|
|
</button>
|
|
<div class="paper-feature-more">
|
|
<span class="paper-feature-title paper-feature-title-m" aria-hidden="true">{{ f?.title.split('-')[0] }}<span class="serif-hy" v-if="f?.title.includes('-')">-</span>{{ f?.title.split('-').slice(1).join('-') }} {{ 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-qa-r3 paper-wrap" aria-labelledby="qa-heading">
|
|
<div class="qa-head">
|
|
<div>
|
|
<div class="paper-eyebrow">Before you sign in</div>
|
|
<h2 id="qa-heading">The questions that come up most.</h2>
|
|
</div>
|
|
<a class="paper-link-arrow" href="/faq">Read the full FAQ →</a>
|
|
</div>
|
|
<div class="qa-grid">
|
|
<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" target="_self" href="https://anonymous.4open.science/r/840c8c57-3c32-451e-bf12-0e20be300389/">See an anonymized repository →</a>
|
|
</div>
|
|
</section>
|
|
<partial-view name="partials/footer.htm" :state="viewState"></partial-view>
|
|
</div>
|