Goon — self-hosted aggregator for adult-content scene metadata. Indexes scenes from TPDB, StashDB, and 30+ public adult tube sites. Cross-source deduplication via perceptual hash + Levenshtein distance. FastAPI backend + APScheduler worker + React Native (Expo) mobile client. FOSS, ad-free, donation-funded. See README for details.
66 lines
2.7 KiB
HTML
66 lines
2.7 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<title>{% block title %}goon{% endblock %}</title>
|
|
<script src="https://unpkg.com/htmx.org@2.0.3" defer></script>
|
|
<style>
|
|
:root {
|
|
--bg: #0e1116;
|
|
--fg: #e6edf3;
|
|
--muted: #8b949e;
|
|
--accent: #58a6ff;
|
|
--good: #2ea043;
|
|
--bad: #da3633;
|
|
--warn: #d29922;
|
|
--card: #161b22;
|
|
--border: #30363d;
|
|
}
|
|
* { box-sizing: border-box; }
|
|
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
|
|
background: var(--bg); color: var(--fg); margin: 0; }
|
|
header { padding: 12px 24px; border-bottom: 1px solid var(--border); display: flex; gap: 16px; align-items: center; }
|
|
header h1 { font-size: 18px; margin: 0; }
|
|
header nav a { color: var(--muted); text-decoration: none; margin-right: 16px; }
|
|
header nav a:hover { color: var(--fg); }
|
|
main { max-width: 1200px; margin: 0 auto; padding: 24px; }
|
|
.card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 16px; margin-bottom: 12px; }
|
|
.row { display: flex; gap: 16px; }
|
|
.col { flex: 1; min-width: 0; }
|
|
.muted { color: var(--muted); font-size: 13px; }
|
|
.score { font-weight: 600; }
|
|
.score.high { color: var(--good); }
|
|
.score.mid { color: var(--warn); }
|
|
.score.low { color: var(--bad); }
|
|
button { background: var(--card); color: var(--fg); border: 1px solid var(--border); border-radius: 6px;
|
|
padding: 8px 14px; cursor: pointer; font-size: 14px; }
|
|
button:hover { background: #21262d; }
|
|
button.primary { background: var(--good); border-color: var(--good); }
|
|
button.danger { background: var(--bad); border-color: var(--bad); }
|
|
a { color: var(--accent); text-decoration: none; }
|
|
a:hover { text-decoration: underline; }
|
|
.pill { display: inline-block; padding: 2px 8px; border-radius: 12px; background: var(--card);
|
|
border: 1px solid var(--border); font-size: 12px; margin-right: 4px; }
|
|
.stack > * + * { margin-top: 6px; }
|
|
h2 { margin-top: 0; font-size: 16px; }
|
|
pre { background: #0d1117; padding: 8px; border-radius: 4px; overflow-x: auto; font-size: 12px; }
|
|
.toolbar { display: flex; gap: 8px; margin-bottom: 16px; align-items: center; flex-wrap: wrap; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<h1>goon</h1>
|
|
<nav>
|
|
<a href="/ui/">Pending</a>
|
|
<a href="/ui/?status=auto_merged">Auto-merged</a>
|
|
<a href="/ui/?status=merged">Merged</a>
|
|
<a href="/ui/?status=rejected">Rejected</a>
|
|
<a href="/docs">API</a>
|
|
</nav>
|
|
</header>
|
|
<main>
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
</body>
|
|
</html>
|