Run a blog and changelog
A post list, posts with share links and copy, and a changelog, built like Sidework's letter and Diffkeel's release notes.
A blog is two Templates: blog, one list page, and post, one record per post. A changelog is the same pair, with a release in each post. Sidework publishes a weekly letter this way, and Diffkeel its release notes.
Prerequisites
- A Site's
navandfooter, from Build a landing page.
List the posts
post-list opens on a head (eyebrow, a title of 64, a lede of 200) and holds 1 to 24 posts. The read label, 16 characters, is the word on each link.
{
"$schema": "https://next.mdxui.dev/schema.json",
"theme": "vaultline",
"frame": "none",
"template": "blog",
"title": "Archive · Sidework",
"description": "Every Sidework issue since May 2026, newest first.",
"sections": [
… 1 more section
{sections.1 · post-list
"kind": "section",
"shell": { "inset": "listing", "density": "listing" },
"block": {
"type": "post-list",
"head": {
"eyebrow": "Archive",
"title": "Every issue",
"lede": "24 issues since May 2026, newest first. Issue 1 is free to read; the rest come with the paid letter."
},
"read": "Read",
"posts": [
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-10-20",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Pricing a rush job",
"dek": "A rush costs your evenings twice: the work and what it pushes out. Price both, and say the rush fee first."
},
{
"href": "/subscribe",
"tag": "Work",
"dateline": {
"date": "2026-10-13",
"read": { "minutes": 7, "unit": "min read" }
},
"title": "When to quit the day job",
"dek": "Three numbers decide it: months of costs saved, months of revenue booked, and the hours the side work takes."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-10-06",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The year-end checklist, early",
"dek": "Twelve items to clear in October, so January holds a return and not a search for receipts."
},
{
"href": "/subscribe",
"tag": "Marketing",
"dateline": {
"date": "2026-09-29",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "An email list of fifty",
"dek": "Fifty readers who asked to hear from you outsell a thousand followers. How to collect the first fifty."
},
{
"href": "/subscribe",
"tag": "Work",
"dateline": {
"date": "2026-09-22",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "Your first contractor",
"dek": "What to hand off first, how to write the brief, and how to pay so the work stays yours."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-09-15",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "The case for a second offer",
"dek": "One offer caps what a client can spend. A second, larger offer gives the willing ones somewhere to go."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-09-08",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Packages instead of hours",
"dek": "Hourly rates punish you for getting faster. Turn the three jobs you do most into fixed packages."
},
{
"href": "/subscribe",
"tag": "Clients",
"dateline": {
"date": "2026-09-01",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "A scope that stops creep",
"dek": "One paragraph in the agreement that names what is out, and the sentence to say when a request crosses it."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-08-25",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The quarterly estimate",
"dek": "Estimated tax from your own numbers, with the arithmetic shown and the dates to pay it."
},
{
"href": "/subscribe",
"tag": "Work",
"dateline": {
"date": "2026-08-18",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Before you tell your employer",
"dek": "Read the employment agreement first. Three clauses matter, and one of them is usually missed."
},
{
"href": "/subscribe",
"tag": "Money",
"dateline": {
"date": "2026-08-11",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "A deposit before the work",
"dek": "Ask for half up front, in writing, with a date. The clients who refuse are the ones who pay late."
},
{
"href": "/subscribe",
"tag": "Marketing",
"dateline": {
"date": "2026-08-04",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "Your first referral ask",
"dek": "The best time to ask is the day you deliver. The exact words, and what to send with them."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-07-28",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "Receipts in one folder",
"dek": "One folder, one naming rule, five minutes on Sunday. A system that survives a busy month."
},
{
"href": "/subscribe",
"tag": "Time",
"dateline": {
"date": "2026-07-21",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "The weekly review in twenty minutes",
"dek": "Five questions every Sunday evening: what shipped, what is owed, who is waiting, what is next, what to drop."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-07-14",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Raising prices for existing clients",
"dek": "A notice period, a reason, and a date. The letter to send, and what to do when a client pushes back."
},
{
"href": "/subscribe",
"tag": "Money",
"dateline": {
"date": "2026-07-07",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "A late-payment reminder",
"dek": "Three reminders at 1, 7 and 14 days past due, each shorter and plainer than the last."
},
{
"href": "/subscribe",
"tag": "Time",
"dateline": {
"date": "2026-06-30",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "Tracking hours without a timer",
"dek": "A paper log beside the keyboard beats a timer you forget to start. The four columns it needs."
},
{
"href": "/subscribe",
"tag": "Clients",
"dateline": {
"date": "2026-06-23",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "Saying no to a bad fit",
"dek": "Four signs in the first call, and a reply that turns the work down without closing the door."
},
{
"href": "/subscribe",
"tag": "Marketing",
"dateline": {
"date": "2026-06-16",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "The one-page website",
"dek": "What it says, in order: the job, the price, the proof of work, and one way to start."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-06-09",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "Setting tax aside each month",
"dek": "Move a fixed share of every payment the day it arrives. How to pick the share."
},
{
"href": "/subscribe",
"tag": "Clients",
"dateline": {
"date": "2026-06-02",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "Your first written agreement",
"dek": "One page: the work, the price, the dates, the way out. A template to copy."
},
{
"href": "/subscribe",
"tag": "Money",
"dateline": {
"date": "2026-05-26",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "The separate bank account",
"dek": "Open it before the second invoice. Everything else in your books gets easier from that day."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-05-19",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "A price you can say out loud",
"dek": "Write the price, say it to a mirror, then say it to a client without adding a discount."
},
{
"href": "/issues/the-first-invoice",
"tag": "Money",
"dateline": {
"date": "2026-05-12",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The first invoice",
"dek": "What goes on it, when to send it, and the one line that gets it paid on time."
}
]
}
},
… 2 more sections
]
}
Write each entry
Each post in the list carries its address, a tag of 20, a date as YYYY-MM-DD with an optional reading time, a title of 80 and a dek of 360. For more than 24 posts, split the archive into pages.
{
"$schema": "https://next.mdxui.dev/schema.json",
"theme": "vaultline",
"frame": "none",
"template": "blog",
"title": "Archive · Sidework",
"description": "Every Sidework issue since May 2026, newest first.",
"sections": [
… 1 more section
{sections.1 · post-list
"kind": "section",
"shell": { "inset": "listing", "density": "listing" },
"block": {
"type": "post-list",
"head": {
"eyebrow": "Archive",
"title": "Every issue",
"lede": "24 issues since May 2026, newest first. Issue 1 is free to read; the rest come with the paid letter."
},
"read": "Read",
"posts": [
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-10-20",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Pricing a rush job",
"dek": "A rush costs your evenings twice: the work and what it pushes out. Price both, and say the rush fee first."
},
{
"href": "/subscribe",
"tag": "Work",
"dateline": {
"date": "2026-10-13",
"read": { "minutes": 7, "unit": "min read" }
},
"title": "When to quit the day job",
"dek": "Three numbers decide it: months of costs saved, months of revenue booked, and the hours the side work takes."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-10-06",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The year-end checklist, early",
"dek": "Twelve items to clear in October, so January holds a return and not a search for receipts."
},
{
"href": "/subscribe",
"tag": "Marketing",
"dateline": {
"date": "2026-09-29",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "An email list of fifty",
"dek": "Fifty readers who asked to hear from you outsell a thousand followers. How to collect the first fifty."
},
{
"href": "/subscribe",
"tag": "Work",
"dateline": {
"date": "2026-09-22",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "Your first contractor",
"dek": "What to hand off first, how to write the brief, and how to pay so the work stays yours."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-09-15",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "The case for a second offer",
"dek": "One offer caps what a client can spend. A second, larger offer gives the willing ones somewhere to go."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-09-08",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Packages instead of hours",
"dek": "Hourly rates punish you for getting faster. Turn the three jobs you do most into fixed packages."
},
{
"href": "/subscribe",
"tag": "Clients",
"dateline": {
"date": "2026-09-01",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "A scope that stops creep",
"dek": "One paragraph in the agreement that names what is out, and the sentence to say when a request crosses it."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-08-25",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The quarterly estimate",
"dek": "Estimated tax from your own numbers, with the arithmetic shown and the dates to pay it."
},
{
"href": "/subscribe",
"tag": "Work",
"dateline": {
"date": "2026-08-18",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Before you tell your employer",
"dek": "Read the employment agreement first. Three clauses matter, and one of them is usually missed."
},
{
"href": "/subscribe",
"tag": "Money",
"dateline": {
"date": "2026-08-11",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "A deposit before the work",
"dek": "Ask for half up front, in writing, with a date. The clients who refuse are the ones who pay late."
},
{
"href": "/subscribe",
"tag": "Marketing",
"dateline": {
"date": "2026-08-04",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "Your first referral ask",
"dek": "The best time to ask is the day you deliver. The exact words, and what to send with them."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-07-28",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "Receipts in one folder",
"dek": "One folder, one naming rule, five minutes on Sunday. A system that survives a busy month."
},
{
"href": "/subscribe",
"tag": "Time",
"dateline": {
"date": "2026-07-21",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "The weekly review in twenty minutes",
"dek": "Five questions every Sunday evening: what shipped, what is owed, who is waiting, what is next, what to drop."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-07-14",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Raising prices for existing clients",
"dek": "A notice period, a reason, and a date. The letter to send, and what to do when a client pushes back."
},
{
"href": "/subscribe",
"tag": "Money",
"dateline": {
"date": "2026-07-07",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "A late-payment reminder",
"dek": "Three reminders at 1, 7 and 14 days past due, each shorter and plainer than the last."
},
{
"href": "/subscribe",
"tag": "Time",
"dateline": {
"date": "2026-06-30",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "Tracking hours without a timer",
"dek": "A paper log beside the keyboard beats a timer you forget to start. The four columns it needs."
},
{
"href": "/subscribe",
"tag": "Clients",
"dateline": {
"date": "2026-06-23",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "Saying no to a bad fit",
"dek": "Four signs in the first call, and a reply that turns the work down without closing the door."
},
{
"href": "/subscribe",
"tag": "Marketing",
"dateline": {
"date": "2026-06-16",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "The one-page website",
"dek": "What it says, in order: the job, the price, the proof of work, and one way to start."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-06-09",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "Setting tax aside each month",
"dek": "Move a fixed share of every payment the day it arrives. How to pick the share."
},
{
"href": "/subscribe",
"tag": "Clients",
"dateline": {
"date": "2026-06-02",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "Your first written agreement",
"dek": "One page: the work, the price, the dates, the way out. A template to copy."
},
{
"href": "/subscribe",
"tag": "Money",
"dateline": {
"date": "2026-05-26",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "The separate bank account",
"dek": "Open it before the second invoice. Everything else in your books gets easier from that day."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-05-19",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "A price you can say out loud",
"dek": "Write the price, say it to a mirror, then say it to a client without adding a discount."
},
{
"href": "/issues/the-first-invoice",
"tag": "Money",
"dateline": {
"date": "2026-05-12",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The first invoice",
"dek": "What goes on it, when to send it, and the one line that gets it paid on time."
}
]
}
},
… 2 more sections
]
}
Write a post
A post is one article section between the nav and the footer. Its head takes a back link, a tag, a dateline, a title of 80 and a dek of 360. The body runs to 12,000 characters, and each fenced code block in it names one of the highlight languages, or the record is refused at that block's line.
{
"$schema": "https://next.mdxui.dev/schema.json",
"theme": "vaultline",
"frame": "none",
"template": "post",
"title": "The first invoice · Sidework",
"description": "What goes on a first invoice, when to send it, and the one line that gets it paid on time.",
"meta": { "type": "article" },
"sections": [
… 1 more section
{sections.1 · article
"kind": "article",
"shell": { "inset": "article", "density": "article" },
"block": {
"type": "article",
"head": {
"back": { "href": "/archive", "label": "Archive" },
"tag": "Money",
"dateline": {
"date": "2026-05-12",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The first invoice",
"dek": "What goes on it, when to send it, and the one line that gets it paid on time."
},
"share": {
"url": "https://sidework.example/issues/the-first-invoice",
"title": "The first invoice",
"label": "Share",
"on": ["linkedin", "bluesky", "x", "reddit", "hackernews"]
},
"copy": true,
"body": "The first invoice is where a side project becomes a business. It is also where most people undercharge, send late and wait.\n\n## Send it the day the work lands\n\nAn invoice sent with the work reads as part of the work. One sent a week later reads as a request. Attach it to the delivery email.\n\n## Seven lines, no more\n\n1. Your name or business name, and how to reach you.\n2. The client and the person who approves payment.\n3. An invoice number. Start at 1001; nobody needs to know it is your first.\n4. The date sent and the date due.\n5. One line per piece of work, each with its price.\n6. The total, and any tax on it.\n7. How to pay: one method, written out in full.\n\n## The line that gets it paid\n\n> Due 14 days from today, on 26 May.\n\nName the date, not the terms. \"Net 14\" asks the client to count. A date goes straight into a calendar.\n\n## The template\n\n```text\nINVOICE 1001 Sent 12 May 2026\n Due 26 May 2026\nFrom Your Name, you@mail.example\nTo The Client, accounts@client.example\n\nLogo design, three rounds 600.00\nBusiness letterhead 150.00\n Total 750.00\n\nPay by bank transfer to the account below.\n```\n\n## When it is late\n\nSend one short reminder the day after the due date. Issue 9 holds the three reminders that follow it."
}
},
… 2 more sections
]
}
Add share and copy
share takes the post's address and title, a label of 16 characters, and one to five networks: reddit, x, linkedin, bluesky and hackernews. copy: true puts a copy button on every code block of the body.
{
"$schema": "https://next.mdxui.dev/schema.json",
"theme": "vaultline",
"frame": "none",
"template": "post",
"title": "The first invoice · Sidework",
"description": "What goes on a first invoice, when to send it, and the one line that gets it paid on time.",
"meta": { "type": "article" },
"sections": [
… 1 more section
{sections.1 · article
"kind": "article",
"shell": { "inset": "article", "density": "article" },
"block": {
"type": "article",
"head": {
"back": { "href": "/archive", "label": "Archive" },
"tag": "Money",
"dateline": {
"date": "2026-05-12",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The first invoice",
"dek": "What goes on it, when to send it, and the one line that gets it paid on time."
},
"share": {
"url": "https://sidework.example/issues/the-first-invoice",
"title": "The first invoice",
"label": "Share",
"on": ["linkedin", "bluesky", "x", "reddit", "hackernews"]
},
"copy": true,
"body": "The first invoice is where a side project becomes a business. It is also where most people undercharge, send late and wait.\n\n## Send it the day the work lands\n\nAn invoice sent with the work reads as part of the work. One sent a week later reads as a request. Attach it to the delivery email.\n\n## Seven lines, no more\n\n1. Your name or business name, and how to reach you.\n2. The client and the person who approves payment.\n3. An invoice number. Start at 1001; nobody needs to know it is your first.\n4. The date sent and the date due.\n5. One line per piece of work, each with its price.\n6. The total, and any tax on it.\n7. How to pay: one method, written out in full.\n\n## The line that gets it paid\n\n> Due 14 days from today, on 26 May.\n\nName the date, not the terms. \"Net 14\" asks the client to count. A date goes straight into a calendar.\n\n## The template\n\n```text\nINVOICE 1001 Sent 12 May 2026\n Due 26 May 2026\nFrom Your Name, you@mail.example\nTo The Client, accounts@client.example\n\nLogo design, three rounds 600.00\nBusiness letterhead 150.00\n Total 750.00\n\nPay by bank transfer to the account below.\n```\n\n## When it is late\n\nSend one short reminder the day after the due date. Issue 9 holds the three reminders that follow it."
}
},
… 2 more sections
]
}
Run a changelog
Give each release its own post record, tagged with its version, and list them newest first with the same post-list. Diffkeel's changelog is a blog page; each release is a post.
{
"$schema": "https://next.mdxui.dev/schema.json",
"theme": "certificate",
"frame": "sheet",
"template": "blog",
"title": "Changelog · Diffkeel",
"description": "Every release of the Diffkeel CLI, newest first.",
"sections": [
… 1 more section
{sections.1 · post-list
"kind": "section",
"shell": { "inset": "listing", "density": "listing" },
"block": {
"type": "post-list",
"head": {
"eyebrow": "Changelog",
"title": "Releases",
"lede": "Every release of the CLI, newest first. Each entry links to the page it changed."
},
"read": "Notes",
"posts": [
{
"href": "/changelog/0-9",
"tag": "0.9",
"dateline": {
"date": "2026-10-06",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "Secrets masked by default",
"dek": "Every key that looks like a secret is masked unless the config says otherwise. Masked changes print a short hash."
},
{
"href": "/docs/first-diff",
"tag": "0.8",
"dateline": {
"date": "2026-09-08",
"read": { "minutes": 2, "unit": "min read" }
},
"title": "TOML and env files",
"dek": "Diffkeel reads TOML and dotenv files beside YAML and JSON, and resolves them in the order the config lists."
},
{
"href": "/install",
"tag": "0.7",
"dateline": {
"date": "2026-08-11",
"read": { "minutes": 2, "unit": "min read" }
},
"title": "The check command",
"dek": "`diffkeel check` exits 1 while a change lacks a review, so any CI can stop a deploy on it."
},
{
"href": "/docs/first-diff",
"tag": "0.6",
"dateline": {
"date": "2026-07-14",
"read": { "minutes": 1, "unit": "min read" }
},
"title": "JSON output for agents",
"dek": "`--json` prints each change as one object with its key, file, before and after."
}
]
}
},
… 2 more sections
]
}
Result
The Result is a post as it ships. Flip the Theme chips to read the same article in another Brand's typefaces.
{
"$schema": "https://next.mdxui.dev/schema.json",
"theme": "vaultline",
"frame": "none",
"template": "blog",
"title": "Archive · Sidework",
"description": "Every Sidework issue since May 2026, newest first.",
"sections": [
… 1 more section
{sections.1 · post-list
"kind": "section",
"shell": { "inset": "listing", "density": "listing" },
"block": {
"type": "post-list",
"head": {
"eyebrow": "Archive",
"title": "Every issue",
"lede": "24 issues since May 2026, newest first. Issue 1 is free to read; the rest come with the paid letter."
},
"read": "Read",
"posts": [
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-10-20",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Pricing a rush job",
"dek": "A rush costs your evenings twice: the work and what it pushes out. Price both, and say the rush fee first."
},
{
"href": "/subscribe",
"tag": "Work",
"dateline": {
"date": "2026-10-13",
"read": { "minutes": 7, "unit": "min read" }
},
"title": "When to quit the day job",
"dek": "Three numbers decide it: months of costs saved, months of revenue booked, and the hours the side work takes."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-10-06",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The year-end checklist, early",
"dek": "Twelve items to clear in October, so January holds a return and not a search for receipts."
},
{
"href": "/subscribe",
"tag": "Marketing",
"dateline": {
"date": "2026-09-29",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "An email list of fifty",
"dek": "Fifty readers who asked to hear from you outsell a thousand followers. How to collect the first fifty."
},
{
"href": "/subscribe",
"tag": "Work",
"dateline": {
"date": "2026-09-22",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "Your first contractor",
"dek": "What to hand off first, how to write the brief, and how to pay so the work stays yours."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-09-15",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "The case for a second offer",
"dek": "One offer caps what a client can spend. A second, larger offer gives the willing ones somewhere to go."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-09-08",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Packages instead of hours",
"dek": "Hourly rates punish you for getting faster. Turn the three jobs you do most into fixed packages."
},
{
"href": "/subscribe",
"tag": "Clients",
"dateline": {
"date": "2026-09-01",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "A scope that stops creep",
"dek": "One paragraph in the agreement that names what is out, and the sentence to say when a request crosses it."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-08-25",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The quarterly estimate",
"dek": "Estimated tax from your own numbers, with the arithmetic shown and the dates to pay it."
},
{
"href": "/subscribe",
"tag": "Work",
"dateline": {
"date": "2026-08-18",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Before you tell your employer",
"dek": "Read the employment agreement first. Three clauses matter, and one of them is usually missed."
},
{
"href": "/subscribe",
"tag": "Money",
"dateline": {
"date": "2026-08-11",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "A deposit before the work",
"dek": "Ask for half up front, in writing, with a date. The clients who refuse are the ones who pay late."
},
{
"href": "/subscribe",
"tag": "Marketing",
"dateline": {
"date": "2026-08-04",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "Your first referral ask",
"dek": "The best time to ask is the day you deliver. The exact words, and what to send with them."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-07-28",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "Receipts in one folder",
"dek": "One folder, one naming rule, five minutes on Sunday. A system that survives a busy month."
},
{
"href": "/subscribe",
"tag": "Time",
"dateline": {
"date": "2026-07-21",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "The weekly review in twenty minutes",
"dek": "Five questions every Sunday evening: what shipped, what is owed, who is waiting, what is next, what to drop."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-07-14",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "Raising prices for existing clients",
"dek": "A notice period, a reason, and a date. The letter to send, and what to do when a client pushes back."
},
{
"href": "/subscribe",
"tag": "Money",
"dateline": {
"date": "2026-07-07",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "A late-payment reminder",
"dek": "Three reminders at 1, 7 and 14 days past due, each shorter and plainer than the last."
},
{
"href": "/subscribe",
"tag": "Time",
"dateline": {
"date": "2026-06-30",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "Tracking hours without a timer",
"dek": "A paper log beside the keyboard beats a timer you forget to start. The four columns it needs."
},
{
"href": "/subscribe",
"tag": "Clients",
"dateline": {
"date": "2026-06-23",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "Saying no to a bad fit",
"dek": "Four signs in the first call, and a reply that turns the work down without closing the door."
},
{
"href": "/subscribe",
"tag": "Marketing",
"dateline": {
"date": "2026-06-16",
"read": { "minutes": 5, "unit": "min read" }
},
"title": "The one-page website",
"dek": "What it says, in order: the job, the price, the proof of work, and one way to start."
},
{
"href": "/subscribe",
"tag": "Tax",
"dateline": {
"date": "2026-06-09",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "Setting tax aside each month",
"dek": "Move a fixed share of every payment the day it arrives. How to pick the share."
},
{
"href": "/subscribe",
"tag": "Clients",
"dateline": {
"date": "2026-06-02",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "Your first written agreement",
"dek": "One page: the work, the price, the dates, the way out. A template to copy."
},
{
"href": "/subscribe",
"tag": "Money",
"dateline": {
"date": "2026-05-26",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "The separate bank account",
"dek": "Open it before the second invoice. Everything else in your books gets easier from that day."
},
{
"href": "/subscribe",
"tag": "Pricing",
"dateline": {
"date": "2026-05-19",
"read": { "minutes": 4, "unit": "min read" }
},
"title": "A price you can say out loud",
"dek": "Write the price, say it to a mirror, then say it to a client without adding a discount."
},
{
"href": "/issues/the-first-invoice",
"tag": "Money",
"dateline": {
"date": "2026-05-12",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The first invoice",
"dek": "What goes on it, when to send it, and the one line that gets it paid on time."
}
]
}
},
… 2 more sections
]
}
{
"$schema": "https://next.mdxui.dev/schema.json",
"theme": "vaultline",
"frame": "none",
"template": "post",
"title": "The first invoice · Sidework",
"description": "What goes on a first invoice, when to send it, and the one line that gets it paid on time.",
"meta": { "type": "article" },
"sections": [
… 1 more section
{sections.1 · article
"kind": "article",
"shell": { "inset": "article", "density": "article" },
"block": {
"type": "article",
"head": {
"back": { "href": "/archive", "label": "Archive" },
"tag": "Money",
"dateline": {
"date": "2026-05-12",
"read": { "minutes": 6, "unit": "min read" }
},
"title": "The first invoice",
"dek": "What goes on it, when to send it, and the one line that gets it paid on time."
},
"share": {
"url": "https://sidework.example/issues/the-first-invoice",
"title": "The first invoice",
"label": "Share",
"on": ["linkedin", "bluesky", "x", "reddit", "hackernews"]
},
"copy": true,
"body": "The first invoice is where a side project becomes a business. It is also where most people undercharge, send late and wait.\n\n## Send it the day the work lands\n\nAn invoice sent with the work reads as part of the work. One sent a week later reads as a request. Attach it to the delivery email.\n\n## Seven lines, no more\n\n1. Your name or business name, and how to reach you.\n2. The client and the person who approves payment.\n3. An invoice number. Start at 1001; nobody needs to know it is your first.\n4. The date sent and the date due.\n5. One line per piece of work, each with its price.\n6. The total, and any tax on it.\n7. How to pay: one method, written out in full.\n\n## The line that gets it paid\n\n> Due 14 days from today, on 26 May.\n\nName the date, not the terms. \"Net 14\" asks the client to count. A date goes straight into a calendar.\n\n## The template\n\n```text\nINVOICE 1001 Sent 12 May 2026\n Due 26 May 2026\nFrom Your Name, you@mail.example\nTo The Client, accounts@client.example\n\nLogo design, three rounds 600.00\nBusiness letterhead 150.00\n Total 750.00\n\nPay by bank transfer to the account below.\n```\n\n## When it is late\n\nSend one short reminder the day after the due date. Issue 9 holds the three reminders that follow it."
}
},
… 2 more sections
]
}
{
"$schema": "https://next.mdxui.dev/schema.json",
"theme": "certificate",
"frame": "sheet",
"template": "blog",
"title": "Changelog · Diffkeel",
"description": "Every release of the Diffkeel CLI, newest first.",
"sections": [
… 1 more section
{sections.1 · post-list
"kind": "section",
"shell": { "inset": "listing", "density": "listing" },
"block": {
"type": "post-list",
"head": {
"eyebrow": "Changelog",
"title": "Releases",
"lede": "Every release of the CLI, newest first. Each entry links to the page it changed."
},
"read": "Notes",
"posts": [
{
"href": "/changelog/0-9",
"tag": "0.9",
"dateline": {
"date": "2026-10-06",
"read": { "minutes": 3, "unit": "min read" }
},
"title": "Secrets masked by default",
"dek": "Every key that looks like a secret is masked unless the config says otherwise. Masked changes print a short hash."
},
{
"href": "/docs/first-diff",
"tag": "0.8",
"dateline": {
"date": "2026-09-08",
"read": { "minutes": 2, "unit": "min read" }
},
"title": "TOML and env files",
"dek": "Diffkeel reads TOML and dotenv files beside YAML and JSON, and resolves them in the order the config lists."
},
{
"href": "/install",
"tag": "0.7",
"dateline": {
"date": "2026-08-11",
"read": { "minutes": 2, "unit": "min read" }
},
"title": "The check command",
"dek": "`diffkeel check` exits 1 while a change lacks a review, so any CI can stop a deploy on it."
},
{
"href": "/docs/first-diff",
"tag": "0.6",
"dateline": {
"date": "2026-07-14",
"read": { "minutes": 1, "unit": "min read" }
},
"title": "JSON output for agents",
"dek": "`--json` prints each change as one object with its key, file, before and after."
}
]
}
},
… 2 more sections
]
}