Bosia Bosia v0.8.11

Pages — Blog Post

A blog post page composed from blocks — navbar, post header, prose body, related row and footer.

A complete blog post page: a minimal navbar, the post header, a 70ch prose body, a related-posts row and a minimal footer. Every block is theme-aware — try the theme switcher above the preview.

Preview

B
__BRAND__
Product

Shipping beats polishing

Why a released rough edge teaches you more than an unreleased perfect one.

Jeki Maulana

Jeki Maulana

6 min read

Desk with an open notebook and laptop

The fastest way to learn what a feature is worth is to put it in front of people who didn't build it. Polish delays that lesson; shipping collects it.

Rough edges are feedback magnets

Users forgive an honest rough edge far more readily than a missing capability. What they won't do is imagine the feature you kept on a branch.

A released rough edge teaches you more than an unreleased perfect one.

What we do instead

  • Ship the smallest slice that answers a real question.
  • Watch how it's used for a week before touching it again.
  • Polish only the paths people actually walk.

None of this is an argument against quality. It's an argument about sequence: quality earns its keep after usefulness is proven, not before.

Install

bun x bosia@latest add page blog/post

Installs page.svelte plus every block it composes.

Usage

<script lang="ts">
	import Post from "$lib/pages/blog/post/page.svelte";
</script>

<Post />

Without props the page renders the sample post baked into the blocks. To serve real content, install the blog feature — its loader for /blog/[slug] returns post and related in exactly the shape the page accepts:

<script lang="ts">
	import Post from "$lib/pages/blog/post/page.svelte";

	let { data } = $props();
</script>

<Post post={data.post} bodyHtml={data.post.body} related={data.related} />

bodyHtml is rendered unescaped by blog/post-body — only pass trusted content (your own database), never user input.

Source

src/lib/pages/blog/post/page.svelte