Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ COPY --chmod=755 ./rel/docker-entrypoint.sh /entrypoint.sh
# docker container can be started with arbitrary uid
RUN mkdir -p /var/lib/plausible && chmod ugo+rw -R /var/lib/plausible

COPY --chmod=444 ./landing/index.html /app/landing/index.html

USER 999
WORKDIR /app
ENV LISTEN_IP=0.0.0.0
Expand Down
1 change: 1 addition & 0 deletions Procfile
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
web: /app/bin/plausible start
web-landing: /bin/busybox httpd -f -c /dev/null -p 8000 -h /app/landing
release: /app/bin/plausible eval Plausible.Release.interweave_migrate
255 changes: 255 additions & 0 deletions landing/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,255 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Python Infra Analytics &mdash; PSF</title>
<style>
:root {
--py-blue: #306998;
--py-blue-dark: #1e4f72;
--py-yellow: #ffd43b;
--py-yellow-muted: #ffe873;
--bg: #0f1117;
--surface: #181b24;
--surface-hover: #1f2330;
--border: #2a2e3a;
--text: #e2e4e9;
--text-muted: #8b8fa3;
--text-dim: #5c6070;
}

* { margin: 0; padding: 0; box-sizing: border-box; }

body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
background: var(--bg);
color: var(--text);
min-height: 100vh;
display: flex;
flex-direction: column;
}

.hero {
padding: 4rem 2rem 3rem;
text-align: center;
background: linear-gradient(180deg, rgba(48, 105, 152, 0.12) 0%, transparent 100%);
border-bottom: 1px solid var(--border);
}

.logo-row {
display: flex;
align-items: center;
justify-content: center;
gap: 1rem;
margin-bottom: 1.5rem;
}

.logo-row svg {
flex-shrink: 0;
}

.hero h1 {
font-size: 1.75rem;
font-weight: 700;
letter-spacing: -0.02em;
}

.hero h1 span {
color: var(--py-yellow);
}

.hero p {
margin-top: 0.75rem;
color: var(--text-muted);
font-size: 1.05rem;
max-width: 540px;
margin-left: auto;
margin-right: auto;
line-height: 1.6;
}

.main {
flex: 1;
max-width: 820px;
width: 100%;
margin: 0 auto;
padding: 2.5rem 2rem;
}

.section-label {
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--text-dim);
margin-bottom: 1rem;
}

.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 0.75rem;
}

.card {
display: flex;
align-items: center;
gap: 0.875rem;
padding: 1rem 1.125rem;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 10px;
text-decoration: none;
color: var(--text);
transition: background 0.15s, border-color 0.15s, transform 0.15s;
}

.card:hover {
background: var(--surface-hover);
border-color: var(--py-blue);
transform: translateY(-1px);
}

.card-icon {
width: 40px;
height: 40px;
border-radius: 8px;
background: rgba(48, 105, 152, 0.15);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}

.card-icon svg {
width: 20px;
height: 20px;
color: var(--py-blue);
stroke: currentColor;
fill: none;
stroke-width: 1.75;
stroke-linecap: round;
stroke-linejoin: round;
}

.card-body {
min-width: 0;
}

.card-title {
font-size: 0.95rem;
font-weight: 600;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}

.card-desc {
font-size: 0.8rem;
color: var(--text-muted);
margin-top: 0.15rem;
}

.footer {
text-align: center;
padding: 2rem;
color: var(--text-dim);
font-size: 0.8rem;
border-top: 1px solid var(--border);
}

.footer a {
color: var(--text-muted);
text-decoration: none;
}

.footer a:hover {
color: var(--py-yellow);
}

@media (max-width: 480px) {
.hero { padding: 2.5rem 1.25rem 2rem; }
.hero h1 { font-size: 1.35rem; }
.main { padding: 1.5rem 1.25rem; }
.grid { grid-template-columns: 1fr; }
}
</style>
</head>
<body>

<header class="hero">
<div class="logo-row">
<img src="https://www.python.org/static/img/python-logo.png" alt="Python" height="48">
</div>
<h1>Python <span>Infra Analytics</span></h1>
<p>
Public web analytics for Python Software Foundation infrastructure.
</p>
</header>

<main class="main">
<div class="section-label">Public Dashboards</div>
<div class="grid">

<a class="card" href="/python.org">
<div class="card-icon">
<svg viewBox="0 0 24 24"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>
</div>
<div class="card-body">
<div class="card-title">python.org</div>
<div class="card-desc">Main website</div>
</div>
</a>

<a class="card" href="/docs.python.org">
<div class="card-icon">
<svg viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 016.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/></svg>
</div>
<div class="card-body">
<div class="card-title">docs.python.org</div>
<div class="card-desc">Documentation</div>
</div>
</a>

<a class="card" href="/devguide.python.org">
<div class="card-icon">
<svg viewBox="0 0 24 24"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>
</div>
<div class="card-body">
<div class="card-title">devguide.python.org</div>
<div class="card-desc">Developer guide</div>
</div>
</a>

<a class="card" href="/peps.python.org">
<div class="card-icon">
<svg viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg>
</div>
<div class="card-body">
<div class="card-title">peps.python.org</div>
<div class="card-desc">Enhancement proposals</div>
</div>
</a>

<a class="card" href="/packaging.python.org">
<div class="card-icon">
<svg viewBox="0 0 24 24"><path d="M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16z"/><polyline points="3.27 6.96 12 12.01 20.73 6.96"/><line x1="12" y1="22.08" x2="12" y2="12"/></svg>
</div>
<div class="card-body">
<div class="card-title">packaging.python.org</div>
<div class="card-desc">Packaging user guide</div>
</div>
</a>

</div>
</main>

<footer class="footer">
<a href="https://www.python.org/psf/">Python Software Foundation</a>
&nbsp;&middot;&nbsp;
<a href="https://plausible.io">Powered by Plausible</a>
</footer>

</body>
</html>
Loading