Add repository-owned project publishing
Deploy production / deploy (push) Successful in 4s

This commit is contained in:
2026-08-11 23:24:55 -07:00
parent 2b4eb9f0f6
commit ec6e21bb25
17 changed files with 1742 additions and 35 deletions
+1 -1
View File
@@ -9,7 +9,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=Inter:wght@400;500&family=Playfair+Display:ital,wght@0,600;0,700;1,500;1,600&display=swap" rel="stylesheet">
<link rel="icon" href="{{ '/static/favicon.svg'|url }}" type="image/svg+xml">
<link rel="stylesheet" href="{{ '/static/style.css'|url }}?v=4">
<link rel="stylesheet" href="{{ '/static/style.css'|url }}?v=5">
<script src="{{ '/static/tags.js'|url }}?v=1" defer></script>
</head>
<body>
+40
View File
@@ -0,0 +1,40 @@
{% extends "base.html" %}
{% block body %}
{% set project = this.parent.parent %}
{% set siblings = this.get_siblings() %}
<article class="devlog-entry-layout shell">
<header class="devlog-entry-header">
<p class="eyebrow"><a href="{{ project|url }}">{{ project.title }}</a> · Devlog</p>
<h1>{{ this.title }}</h1>
<p class="dek">{{ this.summary }}</p>
</header>
<aside class="post-info devlog-info" aria-label="Development log information">
<p class="post-info-title">Development note</p>
<dl>
<div class="post-info-row"><dt>Project</dt><dd><a href="{{ project|url }}">{{ project.title }}</a></dd></div>
<div class="post-info-row"><dt>Published</dt><dd><time datetime="{{ this.date }}">{{ this.date|dateformat('long') }}</time></dd></div>
<div class="post-info-row"><dt>Author</dt><dd>{{ this.author }}</dd></div>
<div class="post-info-row">
<dt>Source commit</dt>
<dd><a href="{{ this.source_commit_url }}"><code>{{ this.source_commit[:10] }}</code></a></dd>
</div>
{% if this.topic_tags %}<div class="post-info-row"><dt>Topics</dt><dd class="technology-list">{% for tag in this.topic_tags %}<span>{{ tag }}</span>{% endfor %}</dd></div>{% endif %}
</dl>
</aside>
<div class="devlog-entry-body prose">
{{ this.body }}
</div>
<nav class="devlog-navigation" aria-label="Development log chronology">
{% if siblings.prev_page %}
<a class="devlog-navigation-link" href="{{ siblings.prev_page|url }}"><span>← Older entry</span><strong>{{ siblings.prev_page.title }}</strong></a>
{% else %}<span></span>{% endif %}
{% if siblings.next_page %}
<a class="devlog-navigation-link devlog-navigation-next" href="{{ siblings.next_page|url }}"><span>Newer entry →</span><strong>{{ siblings.next_page.title }}</strong></a>
{% endif %}
</nav>
<p class="devlog-back"><a href="{{ this.parent|url }}">View the complete {{ project.title }} devlog →</a></p>
</article>
{% endblock %}
+27
View File
@@ -0,0 +1,27 @@
{% extends "base.html" %}
{% block body %}
{% set project = this.parent %}
<section class="hero compact devlog-hero">
<div class="shell narrow">
<p class="eyebrow"><a href="{{ project|url }}">{{ project.title }}</a> · Development log</p>
<h1>{{ this.title }}</h1>
<p class="dek">{{ this.summary }}</p>
</div>
</section>
<section class="activity-section">
<div class="shell">
<div class="section-heading"><span>Development notes</span><span>{{ this.children.count() }} entries</span></div>
<div class="devlog-index">
{% for entry in this.children.order_by('-date', '-source_commit_time') %}
<article class="devlog-index-entry">
<div class="entry-meta"><span class="label">Devlog</span><time datetime="{{ entry.date }}">{{ entry.date|dateformat('YYYY.MM.dd') }}</time></div>
<h2><a href="{{ entry|url }}">{{ entry.title }}</a></h2>
<p>{{ entry.summary }}</p>
{% if entry.topic_tags %}<div class="technology-list">{% for tag in entry.topic_tags %}<span>{{ tag }}</span>{% endfor %}</div>{% endif %}
<a class="read-more" href="{{ entry|url }}">Read entry →</a>
</article>
{% endfor %}
</div>
</div>
</section>
{% endblock %}
+101
View File
@@ -0,0 +1,101 @@
{% extends "base.html" %}
{% block body %}
{% set devlog = site.get(this.path ~ '/devlog') %}
<article class="project-page">
<header class="project-hero">
<div class="shell project-hero-inner">
<div class="project-identity">
{% if this.logo %}<img class="project-logo" src="{{ (this|url) ~ this.logo }}" alt="{{ this.title }} logo" width="96" height="96">{% endif %}
<div>
<p class="eyebrow">Project exhibition · {{ this.status }}</p>
<h1>{{ this.title }}</h1>
<p class="dek">{{ this.summary }}</p>
</div>
</div>
<div class="project-actions" aria-label="Project links">
<a class="button-link button-link-primary" href="{{ this.repository_url }}">Source repository →</a>
<a class="button-link" href="{{ this.repository_readme_url }}">README →</a>
{% if devlog %}<a class="button-link" href="{{ devlog|url }}">Development log →</a>{% endif %}
</div>
</div>
</header>
<div class="project-content shell">
<div class="project-narrative prose">
{{ this.body }}
</div>
<aside class="repository-card" aria-label="Repository information">
<p class="post-info-title">Repository information</p>
<dl>
<div class="post-info-row">
<dt>Latest commit</dt>
<dd>
<a class="commit-link" href="{{ this.repository_commit_url }}">
<code>{{ this.repository_commit_short }}</code>
<span>{{ this.repository_commit_message }}</span>
</a>
<span class="repository-detail">{{ this.repository_commit_author }} · <time datetime="{{ this.repository_commit_date }}">{{ this.repository_commit_date|datetimeformat('medium') }}</time></span>
</dd>
</div>
<div class="repository-pair">
<div class="post-info-row">
<dt>Default branch</dt>
<dd><code>{{ this.default_branch }}</code></dd>
</div>
<div class="post-info-row">
<dt>License</dt>
<dd>{{ this.repository_license }}</dd>
</div>
</div>
{% if this.repository_languages %}
<div class="post-info-row">
<dt>Languages</dt>
<dd class="technology-list">{% for language in this.repository_languages %}<span>{{ language }}</span>{% endfor %}</dd>
</div>
{% endif %}
<div class="repository-pair repository-counts">
<div class="post-info-row"><dt>Open issues</dt><dd>{{ this.repository_open_issues }}</dd></div>
<div class="post-info-row"><dt>Stars</dt><dd>{{ this.repository_stars }}</dd></div>
<div class="post-info-row"><dt>Forks</dt><dd>{{ this.repository_forks }}</dd></div>
</div>
<div class="post-info-row">
<dt>Latest release</dt>
<dd>{% if this.repository_latest_release %}<a href="{{ this.repository_latest_release_url }}">{{ this.repository_latest_release }}</a>{% else %}No published release{% endif %}</dd>
</div>
<div class="post-info-row">
<dt>Imported revision</dt>
<dd><code title="{{ this.repository_commit }}">{{ this.repository_commit_short }}</code><span class="repository-detail">{{ this.sync_status }} · <time datetime="{{ this.synchronized_at }}">{{ this.synchronized_at|datetimeformat('medium') }}</time></span></dd>
</div>
</dl>
</aside>
</div>
{% if this.technology_tags %}
<section class="project-technologies">
<div class="shell">
<div class="section-heading"><span>Built with</span><span>{{ this.technology_tags|length }} technologies</span></div>
<div class="technology-list project-technology-list">{% for tag in this.technology_tags %}<span>{{ tag }}</span>{% endfor %}</div>
</div>
</section>
{% endif %}
{% if devlog %}
<section class="project-devlog-preview">
<div class="shell">
<div class="section-heading"><span>Latest development notes</span><a href="{{ devlog|url }}">View complete devlog →</a></div>
<div class="devlog-card-grid">
{% for entry in devlog.children.order_by('-date', '-source_commit_time').limit(3) %}
<article class="devlog-card">
<time datetime="{{ entry.date }}">{{ entry.date|dateformat('YYYY.MM.dd') }}</time>
<h2><a href="{{ entry|url }}">{{ entry.title }}</a></h2>
<p>{{ entry.summary }}</p>
<a class="read-more" href="{{ entry|url }}">Read devlog →</a>
</article>
{% endfor %}
</div>
</div>
</section>
{% endif %}
</article>
{% endblock %}
+5 -2
View File
@@ -34,8 +34,11 @@
<div class="entry-meta"><span class="label">{{ item.kicker }}</span><time>{{ item.date|dateformat('YYYY.MM.dd') }}</time></div>
<h2><a href="{{ item|url }}">{{ item.title }}</a></h2>
<p>{{ item.summary }}</p>
{% if item.tags %}<div class="entry-tags">{{ tag_links(item.tags) }}</div>{% endif %}
<a class="read-more" href="{{ item|url }}">Read entry →</a>
{% if item.tags %}
{% if item._model == 'project' %}<div class="technology-list entry-tags">{% for tag in item.technology_tags %}<span>{{ tag }}</span>{% endfor %}</div>
{% else %}<div class="entry-tags">{{ tag_links(item.tags) }}</div>{% endif %}
{% endif %}
<a class="read-more" href="{{ item|url }}">{% if item._model == 'project' %}View project{% else %}Read entry{% endif %} →</a>
</article>
{% endfor %}
</div>