App Recipes
These recipes are starting points for Meridiem apps. They are intentionally plain: a human can understand them, and a coding agent can turn them into an app without needing to invent the data model from scratch.
Each recipe follows the same pattern:
- Ask the user to connect Meridiem.
- Find documents that opt into your app through the header.
- Read entries or document text.
- Render a focused interface.
- Write readable markwhen or markdown back to Meridiem.
Feed App
Use this for social feeds, status streams, release logs, public journals, or team updates.
Document shape
---
feedapp:
view: "*"
title: Workshop notes
avatar: https://example.com/avatar.jpg
timezone: America/Los_Angeles
---
2026-03-01 09:30: Shipped the first prototype
status: published
tags: product,prototype
The rough edges are still there, but the loop works.
Store in the header
- Whether the document participates in the feed.
- Display name, avatar, description, and theme.
- Defaults for new posts.
Store on events
status, such asdraftorpublished.- Tags, category, source, or visibility.
- Any app-specific ranking or grouping field.
Scopes
Start with:
openid docs.read:*Add docs.write:* if the app lets users post, edit, or delete from your UI.
First API calls
const { docs } = await meridiem("/api/v1/docs");
const feedDocs = docs.filter((doc) => doc.header?.feedapp?.view);const entries = await meridiem(
`/api/v1/docs/${username}/doc/${docName}/entries`,
{
method: "POST",
body: JSON.stringify({
property_filter: { status: "published" },
}),
}
);Dashboard App
Use this for project dashboards, lightweight CRMs, operations boards, and team overviews.
Document shape
---
dashboard:
enabled: true
owner: Maya
area: Launch
timezone: UTC
---
2026-04-10: Landing page ready
status: done
priority: high
owner: Maya
2026-04-15: Press kit
status: blocked
priority: medium
owner: Chris
Store in the header
- Dashboard membership and display settings.
- Team, project, owner, or account metadata.
- Default filters.
Store on events
- Status, priority, owner, estimate, customer, amount, stage.
- Dates that matter to the item.
- Links in the description when humans should be able to read them.
Scopes
openid docs.read:* docs.write:*First API calls
List docs, filter on header.dashboard.enabled, then read entries. To update a card, append a new event instead of mutating history when possible:
2026-04-16: Press kit unblocked
status: active
priority: medium
owner: Chris
That keeps the document as a useful audit trail.
Journal App
Use this for field notes, private logs, therapy notes, garden journals, workouts, or research diaries.
Document shape
---
journalapp:
enabled: true
moodTracking: true
timezone: America/New_York
---
2026-05-02 21:10: Evening check-in
mood: calm
energy: low
Walked after dinner. The rain made everything quieter.
Store in the header
- Journal settings and prompts.
- Whether the journal is private or shareable.
- Default timezone.
Store on events
- Mood, energy, weather, location, category.
- Prompt IDs or source if an agent generated a prompt.
Scopes
For a read-only reflection app:
openid docs.read:*For an app that writes check-ins:
openid docs.read:* docs.write:*First write
await meridiem(`/api/v1/docs/${username}/doc/${docName}`, {
method: "PATCH",
body: JSON.stringify({
edits: [
{
text: "dt{yyyy-MM-dd HH:mm}: Evening check-in\n mood: calm\n energy: low\n\nWalked after dinner.",
timezone: "America/New_York",
},
],
}),
});Reminder App
Use this for follow-ups, lightweight task systems, habit nudges, or scheduled prompts.
Document shape
---
reminderapp:
enabled: true
timezone: America/Los_Angeles
---
2026-06-01 09:00: Send renewal note
remind: true
channel: email
status: open
Store in the header
- Notification defaults.
- Quiet hours.
- Preferred channels.
Store on events
- Whether an entry should trigger a reminder.
- Channel, status, recurrence, or external task ID.
Scopes
openid docs.read:* docs.write:*Use Webhooks if your reminder app needs to reschedule when documents change.
Agent instruction
Tell the agent:
Find documents where header.reminderapp.enabled is true.
Read entries where properties.remind is true and properties.status is open.
Show upcoming reminders ordered by from_ts.
When a reminder is completed, append a completion event instead of deleting the original.Publishing App
Use this for blogs, newsletters, changelogs, documentation snippets, and small websites.
Markwhen for posts
---
publisher:
site: rob-notes
title: Rob's notes
timezone: America/Los_Angeles
---
2026-07-01: Building with Meridiem
status: published
slug: building-with-meridiem
The key is keeping the source document pleasant to read.
Markdown for pages
Use markdown documents for pages that are not naturally time-based:
# About
I write about small tools, timelines, and local-first software.Store in the header
- Site title, author, theme, canonical URL.
- Publishing defaults.
Store on events
status,slug,summary,tags,canonical.- Per-post image or social metadata.
Scopes
openid docs.read:* docs.write:* media.read:* media.write:*Add media scopes only if the app uploads images or video.
A reusable agent prompt
Build a Meridiem app from this recipe.
Requirements:
- Use OAuth PKCE.
- Store app settings in header.<appNamespace>.
- Store per-entry metadata as markwhen event properties.
- Use /api/v1/docs to discover documents.
- Use /api/v1/docs/:user/doc/:docName/entries for entry lists.
- Use PATCH /api/v1/docs/:user/doc/:docName with edits when appending.
- Refresh the token and retry once when an API call returns 401 or 405.
- Keep the generated markwhen readable to a person opening the document in Meridiem.