digest-website
Digest Website Generator
Transform markdown digests into a polished, shareable website inspired by Dia Browser's release notes.
When to Use
- Running
/publish-digestor/publish-digest [date] - User asks for "shareable page", "public digest", or "release notes page"
- Creating a web presence for weekly/daily updates
- Generating an archive of past issues
Design Inspiration
Reference: https://www.diabrowser.com/release-notes/latest
Key elements:
- Newspaper/editorial aesthetic - Clean, typographic focus
- Issue numbering - Sequential issue numbers (No. 001, 002, etc.)
- Timestamp + location - "January 23, 2026 • San Francisco, USA"
- Past issues archive - Clickable list of previous issues
- Minimal color palette - Black, white, subtle accent
- Large typography - Headlines that command attention
- Generous whitespace - Editorial breathing room
Site Structure
docs/
├── index.html # Latest issue (redirects or shows latest)
├── issues/
│ ├── 001.html # Issue 001 (oldest)
│ ├── 002.html
│ ├── ...
│ └── latest.html # Symlink/redirect to newest
├── archive.html # All past issues
├── assets/
│ ├── style.css # Shared styles
│ └── logo.svg # AskElephant logo
└── CNAME # Custom domain (optional)
Issue Numbering Schema
Track issue numbers in a manifest file:
pm-workspace-docs/status/activity/digest-manifest.json:
{
"$schema": "digest-manifest-v1",
"site_title": "AskElephant Weekly",
"tagline": "What shipped this week",
"location": "San Francisco, USA",
"issues": [
{
"number": 1,
"type": "weekly",
"date": "2026-01-10",
"week": "W02",
"source": "digest-2026-W02.md",
"published": "2026-01-10T17:00:00Z",
"headline": "Global Chat Goes Live"
},
{
"number": 2,
"type": "weekly",
"date": "2026-01-17",
"week": "W03",
"source": "digest-2026-W03.md",
"published": "2026-01-17T17:00:00Z",
"headline": "HubSpot Workflow Builder"
},
{
"number": 3,
"type": "weekly",
"date": "2026-01-24",
"week": "W04",
"source": "digest-2026-W04.md",
"published": "2026-01-24T17:00:00Z",
"headline": "Dialpad Integration Now Live"
}
],
"current_issue": 3,
"app_version_pattern": "2026.W{week}.{patch}"
}
HTML Template
Latest Issue Page (index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AskElephant Weekly | Latest</title>
<meta name="description" content="What shipped this week at AskElephant" />
<meta
property="og:title"
content="AskElephant Weekly - Issue {{ISSUE_NUMBER}}"
/>
<meta property="og:description" content="{{HEADLINE}}" />
<meta property="og:image" content="/assets/og-image.png" />
<link rel="stylesheet" href="/assets/style.css" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link
href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,700;1,6..72,400&family=Inter:wght@400;500;600&display=swap"
rel="stylesheet"
/>
</head>
<body>
<div class="container">
<!-- Masthead -->
<header class="masthead">
<div class="masthead-meta">
<time datetime="{{ISO_DATE}}">{{FORMATTED_DATE}}</time>
<span class="separator">•</span>
<span class="location">San Francisco, USA</span>
</div>
<div class="masthead-issue">
<span class="issue-label">Issue No.</span>
<span class="issue-number">{{ISSUE_NUMBER_PADDED}}</span>
</div>
</header>
<!-- Title -->
<div class="title-block">
<h1 class="site-title">AskElephant Weekly</h1>
<p class="tagline">What shipped this week</p>
</div>
<!-- Headline -->
<article class="headline-card">
<h2 class="headline">{{HEADLINE}}</h2>
<p class="headline-description">{{HEADLINE_DESCRIPTION}}</p>
</article>
<!-- Stats Banner -->
<div class="stats-banner">
<div class="stat">
<span class="stat-value">{{FEATURES_COUNT}}</span>
<span class="stat-label">New Features</span>
</div>
<div class="stat">
<span class="stat-value">{{IMPROVEMENTS_COUNT}}</span>
<span class="stat-label">Improvements</span>
</div>
<div class="stat">
<span class="stat-value">{{BUGS_COUNT}}</span>
<span class="stat-label">Bugs Fixed</span>
</div>
</div>
<!-- Content Sections -->
<main class="content">
{{#if FEATURES}}
<section class="section">
<h3 class="section-title">New Features</h3>
<ul class="feature-list">
{{#each FEATURES}}
<li>
<strong>{{this.title}}</strong>
{{#if this.description}}<span class="item-desc"
>— {{this.description}}</span
>{{/if}}
</li>
{{/each}}
</ul>
</section>
{{/if}} {{#if IMPROVEMENTS}}
<section class="section">
<h3 class="section-title">Improvements</h3>
<ul class="item-list">
{{#each IMPROVEMENTS}}
<li>{{this}}</li>
{{/each}}
</ul>
</section>
{{/if}} {{#if BUGS_COUNT}}
<section class="section">
<h3 class="section-title">Bugs Fixed</h3>
<p class="bugs-summary">{{BUGS_COUNT}} bugs squashed this week</p>
</section>
{{/if}} {{#if COMING_NEXT}}
<section class="section">
<h3 class="section-title">Coming Next</h3>
<ul class="item-list">
{{#each COMING_NEXT}}
<li>{{this}}</li>
{{/each}}
</ul>
</section>
{{/if}}
</main>
<!-- Past Issues -->
<aside class="past-issues">
<h3>Past Issues</h3>
<ul class="archive-list">
{{#each PAST_ISSUES}}
<li>
<a href="/issues/{{this.number}}.html">
<span class="archive-date">{{this.short_date}}</span>
<span class="archive-number">No. {{this.number_padded}}</span>
<span class="archive-headline">{{this.headline}}</span>
</a>
</li>
{{/each}}
</ul>
<a href="/archive.html" class="view-all">View All Issues →</a>
</aside>
<!-- Footer -->
<footer class="footer">
<div class="footer-logo">
<img
src="/assets/logo.svg"
alt="AskElephant"
width="24"
height="24"
/>
<span>AskElephant</span>
</div>
<p class="footer-tagline">Meeting intelligence for revenue teams</p>
</footer>
</div>
</body>
</html>
Stylesheet (assets/style.css)
/* AskElephant Weekly - Newspaper Style */
:root {
--color-bg: #fafafa;
--color-paper: #ffffff;
--color-ink: #1a1a1a;
--color-ink-light: #6b7280;
--color-accent: #d4ff00;
--color-border: #e5e7eb;
--font-serif: "Newsreader", Georgia, serif;
--font-sans: "Inter", -apple-system, sans-serif;
--space-xs: 8px;
--space-sm: 16px;
--space-md: 24px;
--space-lg: 48px;
--space-xl: 64px;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: var(--font-sans);
background: var(--color-bg);
color: var(--color-ink);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
.container {
max-width: 680px;
margin: 0 auto;
padding: var(--space-lg) var(--space-md);
}
/* Masthead */
.masthead {
display: flex;
justify-content: space-between;
align-items: flex-start;
padding-bottom: var(--space-md);
border-bottom: 1px solid var(--color-border);
margin-bottom: var(--space-md);
}
.masthead-meta {
font-size: 12px;
color: var(--color-ink-light);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.masthead-meta .separator {
margin: 0 8px;
}
.masthead-issue {
text-align: right;
}
.issue-label {
display: block;
font-size: 10px;
color: var(--color-ink-light);
text-transform: uppercase;
letter-spacing: 1px;
}
.issue-number {
font-family: var(--font-serif);
font-size: 14px;
font-weight: 400;
letter-spacing: 2px;
}
/* Title Block */
.title-block {
text-align: center;
padding: var(--space-lg) 0;
border-bottom: 2px solid var(--color-ink);
}
.site-title {
font-family: var(--font-serif);
font-size: 42px;
font-weight: 700;
letter-spacing: -1px;
margin-bottom: var(--space-xs);
}
.tagline {
font-size: 14px;
color: var(--color-ink-light);
font-style: italic;
}
/* Headline Card */
.headline-card {
background: var(--color-paper);
padding: var(--space-lg);
margin: var(--space-lg) 0;
border: 1px solid var(--color-border);
text-align: center;
}
.headline {
font-family: var(--font-serif);
font-size: 28px;
font-weight: 700;
line-height: 1.3;
margin-bottom: var(--space-sm);
}
.headline-description {
font-size: 16px;
color: var(--color-ink-light);
max-width: 500px;
margin: 0 auto;
}
/* Stats Banner */
.stats-banner {
display: flex;
justify-content: center;
gap: var(--space-lg);
padding: var(--space-md) 0;
border-top: 1px solid var(--color-border);
border-bottom: 1px solid var(--color-border);
margin-bottom: var(--space-lg);
}
.stat {
text-align: center;
}
.stat-value {
display: block;
font-family: var(--font-serif);
font-size: 36px;
font-weight: 700;
line-height: 1;
}
.stat-label {
font-size: 11px;
color: var(--color-ink-light);
text-transform: uppercase;
letter-spacing: 0.5px;
}
/* Content Sections */
.content {
margin-bottom: var(--space-xl);
}
.section {
margin-bottom: var(--space-lg);
}
.section-title {
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--color-ink-light);
margin-bottom: var(--space-sm);
padding-bottom: var(--space-xs);
border-bottom: 1px solid var(--color-border);
}
.feature-list,
.item-list {
list-style: none;
}
.feature-list li,
.item-list li {
padding: var(--space-sm) 0;
border-bottom: 1px solid var(--color-border);
font-size: 15px;
}
.feature-list li:last-child,
.item-list li:last-child {
border-bottom: none;
}
.item-desc {
color: var(--color-ink-light);
}
.bugs-summary {
font-style: italic;
color: var(--color-ink-light);
}
/* Past Issues */
.past-issues {
background: var(--color-paper);
padding: var(--space-md);
border: 1px solid var(--color-border);
margin-bottom: var(--space-lg);
}
.past-issues h3 {
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: var(--space-sm);
}
.archive-list {
list-style: none;
}
.archive-list li {
border-bottom: 1px solid var(--color-border);
}
.archive-list li:last-child {
border-bottom: none;
}
.archive-list a {
display: flex;
align-items: baseline;
gap: var(--space-sm);
padding: var(--space-sm) 0;
text-decoration: none;
color: var(--color-ink);
transition: opacity 0.2s;
}
.archive-list a:hover {
opacity: 0.7;
}
.archive-date {
font-size: 12px;
color: var(--color-ink-light);
min-width: 80px;
}
.archive-number {
font-size: 11px;
color: var(--color-ink-light);
min-width: 60px;
}
.archive-headline {
font-size: 14px;
flex: 1;
}
.view-all {
display: block;
text-align: center;
padding-top: var(--space-sm);
font-size: 13px;
color: var(--color-ink-light);
text-decoration: none;
}
.view-all:hover {
color: var(--color-ink);
}
/* Footer */
.footer {
text-align: center;
padding-top: var(--space-lg);
border-top: 1px solid var(--color-border);
}
.footer-logo {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-xs);
font-weight: 600;
margin-bottom: var(--space-xs);
}
.footer-tagline {
font-size: 13px;
color: var(--color-ink-light);
}
/* Responsive */
@media (max-width: 600px) {
.container {
padding: var(--space-md) var(--space-sm);
}
.site-title {
font-size: 32px;
}
.headline {
font-size: 22px;
}
.stats-banner {
gap: var(--space-md);
}
.stat-value {
font-size: 28px;
}
}
Generation Procedure
Step 1: Load or Create Manifest
Check for digest-manifest.json:
- If exists, load current issue number
- If not, create with issue number 1
Step 2: Parse Markdown Digest
Extract from source digest:
- Date and week number
- Headline text and description
- Features list with titles/descriptions
- Improvements list
- Bugs count
- Coming next items
Step 3: Generate HTML
- Increment issue number
- Fill HTML template with extracted data
- Generate past issues list (last 5)
- Save to
docs/issues/{number}.html - Update
docs/index.htmlto show latest
Step 4: Update Manifest
Add new issue to manifest:
{
"number": 4,
"type": "weekly",
"date": "2026-01-24",
"week": "W04",
"source": "digest-2026-W04.md",
"published": "2026-01-24T17:00:00Z",
"headline": "Dialpad Integration Now Live"
}
Step 5: Commit and Deploy
If using GitHub Pages:
git add docs/
git commit -m "Publish digest issue #{{NUMBER}}"
git push
Command Options
| Command | Description |
|---|---|
/publish-digest |
Publish most recent digest |
/publish-digest YYYY-WXX |
Publish specific weekly digest |
/publish-digest YYYY-MM-DD |
Publish specific daily digest |
/publish-digest --preview |
Generate but don't commit |
/publish-digest --rebuild |
Rebuild all issues from manifest |
Hosting Options
Option 1: GitHub Pages (Recommended)
- Enable GitHub Pages on
docs/folder - Optionally set custom domain (e.g.,
weekly.askelephant.com) - Commits to
docs/auto-deploy
Setup:
# In pm-workspace repo settings:
# Pages → Source → Deploy from branch → main → /docs
Option 2: Netlify/Vercel
Drop-in deployment from docs/ folder with custom domain support.
Option 3: Internal/Private
Host on internal server if digests shouldn't be public.
File Locations
| File | Location |
|---|---|
| Generated site | pm-workspace-docs/docs/ (or root docs/) |
| Manifest | pm-workspace-docs/status/activity/digest-manifest.json |
| Source digests | pm-workspace-docs/status/activity/digest/digest-*.md |
Integration
With Activity Reporter
After generating a digest with /eod --digest or /eow --digest:
Digest saved to digest-2026-W04.md
Would you like to publish this to the website?
Run /publish-digest to create issue #4.
With Visual Digest
The website can embed or link to visual assets:
- OG image for social sharing
- Header graphics
Example Output
For digest-2026-W04.md → Issue #3:
URL: https://weekly.askelephant.com/ or https://weekly.askelephant.com/issues/003.html
Masthead:
January 24, 2026 • San Francisco, USA Issue No.
003
Title:
AskElephant Weekly
What shipped this week
Content:
┌────────────────────────────────────────────┐
│ │
│ Dialpad Integration Now Live │
│ │
│ Customers using Dialpad can now │
│ connect their telephony directly │
│ to AskElephant │
│ │
└────────────────────────────────────────────┘
21 6 14
New Features Improvements Bugs Fixed
Customization
Adjust Design
Edit assets/style.css to change:
- Colors (update CSS variables)
- Typography (change font imports)
- Layout (adjust spacing, max-width)
Add Branding
Replace in assets/:
logo.svg- Your logoog-image.png- Social preview image (1200x630px)favicon.ico- Browser tab icon
Change Frequency
Modify manifest schema for daily vs weekly preference:
{
"publish_frequency": "weekly", // or "daily"
"publish_day": "friday", // for weekly
"publish_time": "17:00" // local time
}
Error Handling
No Digest Found
⚠️ No digest found for the specified date.
Available digests:
- digest-2026-W04.md (January 20-24)
- digest-2026-W03.md (January 13-17)
Run /eow --digest to generate a new weekly digest first.
Manifest Missing
ℹ️ No digest manifest found. Creating new manifest.
This will be Issue #1. Continue? [Y/n]
Already Published
⚠️ digest-2026-W04.md was already published as Issue #3.
Options:
- /publish-digest --force to republish (updates existing)
- /publish-digest 2026-W05 to publish a different week