diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml
index 5abb25b..b94469b 100644
--- a/.github/workflows/check.yml
+++ b/.github/workflows/check.yml
@@ -12,7 +12,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- project: [docs-starter, graphql, grpc, i18n, multi-source/homepage, multi-source/seeds, multi-source/seeds-sunflower, multi-source/seeds-tomato, multi-source/greenhouses, multi-source/nursery, sse, versioning]
+ project: [blog, docs-starter, graphql, grpc, i18n, multi-source/homepage, multi-source/seeds, multi-source/seeds-sunflower, multi-source/seeds-tomato, multi-source/greenhouses, multi-source/nursery, sse, versioning]
steps:
- name: Checkout repository
uses: actions/checkout@v4
diff --git a/.github/workflows/preview-docs.yml b/.github/workflows/preview-docs.yml
index eae4b03..2146a5c 100644
--- a/.github/workflows/preview-docs.yml
+++ b/.github/workflows/preview-docs.yml
@@ -31,7 +31,7 @@ jobs:
FERN_TOKEN: ${{ secrets.FERN_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
- PROJECTS="docs-starter graphql grpc i18n multi-source/homepage multi-source/seeds multi-source/seeds-sunflower multi-source/seeds-tomato multi-source/greenhouses multi-source/nursery sse versioning"
+ PROJECTS="blog docs-starter graphql grpc i18n multi-source/homepage multi-source/seeds multi-source/seeds-sunflower multi-source/seeds-tomato multi-source/greenhouses multi-source/nursery sse versioning"
CHANGED_FILES=$(git diff --name-only origin/main...HEAD)
: > comment.md
diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml
index b18b9f6..d7b4b0a 100644
--- a/.github/workflows/publish-docs.yml
+++ b/.github/workflows/publish-docs.yml
@@ -12,7 +12,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- project: [docs-starter, graphql, grpc, i18n, multi-source/homepage, multi-source/seeds, multi-source/seeds-sunflower, multi-source/seeds-tomato, multi-source/greenhouses, multi-source/nursery, sse, versioning]
+ project: [blog, docs-starter, graphql, grpc, i18n, multi-source/homepage, multi-source/seeds, multi-source/seeds-sunflower, multi-source/seeds-tomato, multi-source/greenhouses, multi-source/nursery, sse, versioning]
steps:
- name: Checkout repository
uses: actions/checkout@v4
diff --git a/README.md b/README.md
index 0b6e495..4faf48d 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,7 @@ Example Fern docs projects. Each top-level folder is a self-contained example wi
| Example | Description | Live demo |
| --- | --- | --- |
+| [`blog`](./blog) | Blog layout with authors, tags, images, and RSS/Atom/JSON feeds | [blog.docs.buildwithfern.com](https://blog.docs.buildwithfern.com) |
| [`docs-starter`](./docs-starter) | Minimal starter project | [docs-starter.docs.buildwithfern.com](https://docs-starter.docs.buildwithfern.com) |
| [`graphql`](./graphql) | GraphQL API Reference from a `.graphql` schema | [graphql.docs.buildwithfern.com](https://graphql.docs.buildwithfern.com) |
| [`grpc`](./grpc) | gRPC API Reference from `.proto` files | [grpc.docs.buildwithfern.com](https://grpc.docs.buildwithfern.com) |
diff --git a/blog/fern/assets/favicon.svg b/blog/fern/assets/favicon.svg
new file mode 100644
index 0000000..568bb7e
--- /dev/null
+++ b/blog/fern/assets/favicon.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/blog/fern/assets/logo-dark.svg b/blog/fern/assets/logo-dark.svg
new file mode 100644
index 0000000..f8dc4c9
--- /dev/null
+++ b/blog/fern/assets/logo-dark.svg
@@ -0,0 +1,5 @@
+
diff --git a/blog/fern/assets/logo.svg b/blog/fern/assets/logo.svg
new file mode 100644
index 0000000..bb2e269
--- /dev/null
+++ b/blog/fern/assets/logo.svg
@@ -0,0 +1,5 @@
+
diff --git a/blog/fern/blog/2026-01-14.mdx b/blog/fern/blog/2026-01-14.mdx
new file mode 100644
index 0000000..02dcd52
--- /dev/null
+++ b/blog/fern/blog/2026-01-14.mdx
@@ -0,0 +1,12 @@
+---
+title: Winter watering schedules in the API
+slug: blog/winter-watering-schedules
+description: Seasonal watering plans now adjust for daylight hours and indoor humidity.
+tags: ["api", "plant-care"]
+author: mira
+thumbnail: https://images.unsplash.com/photo-1516253593875-bd7ba052fbc5?q=80&w=1200&h=675&fit=crop
+---
+
+The watering endpoint now accepts a greenhouse profile and a local date. It uses daylight hours and indoor humidity to calculate the next recommended watering window.
+
+Existing schedules continue to work without those fields. The response includes the inputs used for the recommendation so store operators can compare it with their manual plan.
diff --git a/blog/fern/blog/2026-02-03.mdx b/blog/fern/blog/2026-02-03.mdx
new file mode 100644
index 0000000..342989b
--- /dev/null
+++ b/blog/fern/blog/2026-02-03.mdx
@@ -0,0 +1,12 @@
+---
+title: Rebuilding the seed catalog search index
+slug: blog/seed-catalog-search
+description: Cultivar synonyms, misspellings, and Latin names now resolve to one canonical seed.
+tags: ["engineering", "search"]
+author: priya
+thumbnail: https://images.unsplash.com/photo-1523348837708-15d4a09cfac2?q=80&w=1200&h=675&fit=crop
+---
+
+The seed catalog index now stores cultivar synonyms beside the canonical seed record. Search requests can match common misspellings and Latin names without duplicating catalog entries.
+
+The rebuild runs from the source catalog and writes a versioned index. Deployments switch indexes after validation, so an incomplete rebuild does not change search results.
diff --git a/blog/fern/blog/2026-03-11.mdx b/blog/fern/blog/2026-03-11.mdx
new file mode 100644
index 0000000..f848ac8
--- /dev/null
+++ b/blog/fern/blog/2026-03-11.mdx
@@ -0,0 +1,14 @@
+---
+title: Streaming greenhouse sensor data
+slug: blog/greenhouse-sensor-streams
+description: Temperature and moisture readings are available over server-sent events.
+tags: ["api", "engineering"]
+authors:
+ - priya
+ - mira
+thumbnail: https://images.unsplash.com/photo-1518770660439-4636190af475?q=80&w=1200&h=675&fit=crop
+---
+
+Greenhouse temperature and moisture readings are now available over a server-sent events endpoint. Each event includes the sensor identifier, reading time, and calibrated value.
+
+Clients can reconnect with the last event identifier after a network interruption. The service keeps a short replay window and closes idle connections after the configured timeout.
diff --git a/blog/fern/blog/2026-04-08.mdx b/blog/fern/blog/2026-04-08.mdx
new file mode 100644
index 0000000..7c0a552
--- /dev/null
+++ b/blog/fern/blog/2026-04-08.mdx
@@ -0,0 +1,12 @@
+---
+title: A soil composition endpoint
+slug: blog/soil-composition-endpoint
+description: Query pH, drainage, and nutrient ranges for every plant we sell.
+tags: ["api"]
+author: mira
+thumbnail: https://images.unsplash.com/photo-1416879595882-3373a0480b5b?q=80&w=1200&h=675&fit=crop
+---
+
+The catalog API now exposes soil composition ranges for each plant. Queries can filter by pH, drainage, and nutrient requirements before returning compatible products.
+
+Values describe the supported range rather than a single recommended number. This lets the storefront compare a customer's soil report with several plants in one request.
diff --git a/blog/fern/blog/2026-05-19.mdx b/blog/fern/blog/2026-05-19.mdx
new file mode 100644
index 0000000..8c9fdf5
--- /dev/null
+++ b/blog/fern/blog/2026-05-19.mdx
@@ -0,0 +1,12 @@
+---
+title: Pruning reminders as webhooks
+slug: blog/pruning-webhooks
+description: Subscribe to per-plant pruning windows instead of polling the schedule endpoint.
+tags: ["api", "plant-care"]
+author: priya
+thumbnail: https://images.unsplash.com/photo-1585320806297-9794b3e4eeae?q=80&w=1200&h=675&fit=crop
+---
+
+The care service can now send pruning-window events to a configured webhook. Subscriptions are scoped to a plant and include the start date, end date, and required tool category.
+
+Delivery attempts use the same retry policy as order events. The event identifier remains stable across retries so receivers can safely de-duplicate updates.
diff --git a/blog/fern/blog/2026-06-24.mdx b/blog/fern/blog/2026-06-24.mdx
new file mode 100644
index 0000000..8bd379a
--- /dev/null
+++ b/blog/fern/blog/2026-06-24.mdx
@@ -0,0 +1,13 @@
+---
+title: Shipping zones and frost dates
+slug: blog/shipping-zones-frost-dates
+description: Orders now validate against the destination's last frost date before checkout.
+tags: ["engineering"]
+author: mira
+thumbnail: https://images.unsplash.com/photo-1586528116311-ad8dd3c8310d?q=80&w=1200&h=675&fit=crop
+excerpt: Live plants ship on a weather-dependent calendar, and the API now enforces it.
+---
+
+Live plants ship on a weather-dependent calendar, and the API now enforces it. Checkout compares the destination zone with the plant's shipping window before accepting an order.
+
+The validation response identifies the first eligible ship date and the rule that delayed the order. Dry goods continue to use the regular zone calendar.
diff --git a/blog/fern/blog/overview.mdx b/blog/fern/blog/overview.mdx
new file mode 100644
index 0000000..e80fa9d
--- /dev/null
+++ b/blog/fern/blog/overview.mdx
@@ -0,0 +1,14 @@
+---
+title: Plantstore blog
+subtitle: Notes from the team building the Plantstore API
+layout: blog
+blog-layout: list
+authors:
+ mira:
+ name: Mira Okonjo
+ role: Developer Advocate
+ url: https://buildwithfern.com
+ priya:
+ name: Priya Nair
+ role: Staff Engineer
+---
diff --git a/blog/fern/docs.yml b/blog/fern/docs.yml
new file mode 100644
index 0000000..b19c720
--- /dev/null
+++ b/blog/fern/docs.yml
@@ -0,0 +1,41 @@
+# yaml-language-server: $schema=https://schema.buildwithfern.dev/docs-yml.json
+
+instances:
+ - url: blog.docs.buildwithfern.com
+
+title: Plantstore
+
+layout:
+ searchbar-placement: header
+ page-width: full
+
+navigation:
+ - section: Get started
+ contents:
+ - page: Overview
+ path: ./pages/overview.mdx
+ icon: fa-duotone fa-seedling
+ - blog: ./blog
+
+navbar-links:
+ - type: minimal
+ text: Fork this repo
+ url: https://github.com/fern-api/docs-examples
+ - type: filled
+ text: Dashboard
+ url: https://dashboard.buildwithfern.com
+
+colors:
+ accent-primary:
+ dark: "#70E155"
+ light: "#008700"
+ background:
+ dark: "#111113"
+ light: "#FFFFFF"
+
+logo:
+ dark: ./assets/logo-dark.svg
+ light: ./assets/logo.svg
+ height: 20
+
+favicon: ./assets/favicon.svg
diff --git a/blog/fern/fern.config.json b/blog/fern/fern.config.json
new file mode 100644
index 0000000..a19aa06
--- /dev/null
+++ b/blog/fern/fern.config.json
@@ -0,0 +1,4 @@
+{
+ "organization": "fern-docs-examples",
+ "version": "5.106.1"
+}
diff --git a/blog/fern/pages/overview.mdx b/blog/fern/pages/overview.mdx
new file mode 100644
index 0000000..a692426
--- /dev/null
+++ b/blog/fern/pages/overview.mdx
@@ -0,0 +1,9 @@
+---
+title: Overview
+description: A small example of Fern's blog changelog layout.
+---
+
+This example uses the `blog:` navigation key with `layout: blog` and `blog-layout: grid`.
+It includes an author registry and posts with per-post `slug`, `tags`, and `image` fields.
+Published posts are available through the blog listing and individual post pages.
+Feeds are available at `/blog.rss`, `/blog.atom`, and `/blog.json`.