New: health-practice theme for Astro and Next.js + Sanity
Linen
The site for an independent health practice: physiotherapy, sports medicine, psychology, or a small clinic with several. Treatments with their prices, the team, the first visit, opening hours and booking, in two editions: Astro, or Next.js with a Sanity Studio. 33 pages, 25 sections and 3 presets, light and dark, WCAG 2.2 AA.
Pay once · Both editions · Lifetime updates


- 33
- pages
- 25
- sections
- 3
- presets
- 2
- editions, one license
- 0
- axe violations
- 5
- treatment colours
Home, treatments, the first visit, prices, the team and booking, ready for your practice.
Every page as it ships, with the invented practice Alder. Switch to dark to see the other mode, and click a page to see all of it.
As considered on a phone.
Every page is checked at phone width in both modes. On a phone a bar with Book and Call rests at the foot of the screen, the next openings run full width with larger times, and the floor plan scrolls sideways in its frame.



Two editions, one license
Static files or a Studio. Same design.
Both editions render the same pages from the same sections and presets, so you choose by who edits the site, not by how it looks. Your license includes both.
- Framework
- AstroAstro 7, static output
- Next.js + SanityNext.js 16, App Router and React Server Components
- Content
- AstroPage copy in typed data files; journal posts in Markdown
- Next.js + SanitySanity Studio with a page builder: pages are stacks of 36 section types, Linen’s own nine included
- Treatments, team and hours
- AstroOne typed file for the treatments and their prices, the team, the locations with opening hours and the next openings
- Next.js + SanityDocuments for treatments, practitioners, locations with opening hours, openings and journal posts
- Booking
- AstroYour booking tool’s address on every Book button, or the request form
- Next.js + SanityThe same, set in the Studio
- Demo content
- AstroIn the repository
- Next.js + SanityA seed script imports every page, treatment, person, location, opening, post and image into your dataset
- Publishing
- AstroRebuild and deploy
- Next.js + SanityPages generated ahead of time, refreshed within a minute or at once with the publish webhook
- Preview
- Astropnpm dev
- Next.js + SanityDrafts beside the form in the Studio’s Presentation tool
- Forms
- AstroAn optional Cloudflare Worker that fails closed, or any form service
- Next.js + SanityA Route Handler that forwards to your endpoint and fails closed
- JavaScript
- AstroSmall inline scripts: the mobile menu, the light/dark switch, today’s opening hours, the team filter, the chosen time slot and the phone booking bar
- Next.js + SanityThe same small parts as client components; every page renders on the server
- Lighthouse, mobile
- Astro96–97
- Next.js + Sanity96–99
- Deploys to
- AstroCloudflare Workers, Netlify, Vercel or any static host
- Next.js + SanityVercel, or Cloudflare Workers through OpenNext
- Repository
- Astrothemesdev/linen-astro
- Next.js + Sanitythemesdev/linen-next
| Aspect | Astro | Next.js + Sanity |
|---|---|---|
| Framework | Astro 7, static output | Next.js 16, App Router and React Server Components |
| Content | Page copy in typed data files; journal posts in Markdown | Sanity Studio with a page builder: pages are stacks of 36 section types, Linen’s own nine included |
| Treatments, team and hours | One typed file for the treatments and their prices, the team, the locations with opening hours and the next openings | Documents for treatments, practitioners, locations with opening hours, openings and journal posts |
| Booking | Your booking tool’s address on every Book button, or the request form | The same, set in the Studio |
| Demo content | In the repository | A seed script imports every page, treatment, person, location, opening, post and image into your dataset |
| Publishing | Rebuild and deploy | Pages generated ahead of time, refreshed within a minute or at once with the publish webhook |
| Preview | pnpm dev | Drafts beside the form in the Studio’s Presentation tool |
| Forms | An optional Cloudflare Worker that fails closed, or any form service | A Route Handler that forwards to your endpoint and fails closed |
| JavaScript | Small inline scripts: the mobile menu, the light/dark switch, today’s opening hours, the team filter, the chosen time slot and the phone booking bar | The same small parts as client components; every page renders on the server |
| Lighthouse, mobile | 96–97 | 96–99 |
| Deploys to | Cloudflare Workers, Netlify, Vercel or any static host | Vercel, or Cloudflare Workers through OpenNext |
| Repository | themesdev/linen-astro | themesdev/linen-next |
What's inside
33 pages from 25 sections.
Each page is a short list of sections: the meadow hero, treatments, the price table, the first visit, practitioners, locations, booking, questions, posts and the rest. The treatments, prices, team, locations and opening hours live in one place, so a new price shows on the home page, the treatment page, the price table and in the structured data at once.
- Home
- A meadow photo behind the first screen with the next three openings, the treatments as five photo columns under their colour keys, the insurers, the practice in figures, the first visit beside the patient plan, a patient’s words, the team, the journal and a booking band with today’s hours.
- Treatments
- Every treatment in its own colour, and a page per treatment: is this for me, what a session looks like, the prices, who gives it, and questions. Five in the demo.
- First visit
- The first hour minute by minute, what to bring and wear, the cancelling rule, and a floor plan of the practice.
- Prices and insurance
- Intake, follow-up and package for every treatment in one table with its colour key, how billing your insurer works, the insurers with a contract, and questions about costs.
- Team
- Everyone at the practice with a filter by treatment, and a page per person: what they treat, how they work, the languages they speak, their next openings and their journal notes. Nine in the demo.
- Journal
- Posts in the colour of the treatment they are about, with the author’s portrait and role, a newsletter sign-up, and every post as Markdown. Six in the demo.
- Questions, contact and booking
- Questions in groups; both locations with their opening hours, today’s row marked and a drawn street map; the next openings as time slots and a booking request that asks for no medical details.
- Privacy, terms, thank-you and 404
- Sample legal texts for the demo practice, privacy with a section on health records, marked as samples until you replace them, and the pages forms and lost visitors land on.
Three looks, one line apart.
Everything a section draws comes from the preset’s tokens: colours, type, space and corners, the five treatment colours included. Switch the import and the whole site changes, the ground photo with it, contrast checked in every mode.



Checked, not promised
Accessible and fast, page by page.
These checks ran on every page of both editions, in light and dark, at desktop and phone widths.
- WCAG 2.2 AA
- Zero axe violations on all 33 pages, in light and dark, at desktop and phone widths. Every preset’s colours, the five treatment colours included, are checked for contrast in every mode.
- Fast on a phone
- Lighthouse performance on mobile: 96–97 for the Astro edition, 96–99 for Next.js, on the home page, a treatment page and prices. Every photo has a fixed ratio and a 1× and 2× file.
- Checked at 17 widths
- Every page measured from 320 to 5120 pixels in both modes, and looked over by a reviewer at every width: no sideways scrolling, no clipped text, no orphaned cards.
- No health details in forms
- The contact form and the booking request ask for no medical details, and say so, with the phone number for anything urgent. They post without JavaScript, carry a honeypot against bots, and refuse submissions until you connect a destination. Nothing visitors send is logged.
- Structured data for a practice
- One MedicalClinic per location with its address, phone, opening hours and the treatments given there; every treatment a Service with its prices; questions, posts and breadcrumbs. A sitemap, RSS, llms.txt and every post as Markdown.
- Design rules, checked
- Colours only from the preset, images with alt text and a size: pnpm lint holds every page to it, yours included.
Delivery
A zip, or straight from GitHub.
Download both editions from your account, or connect GitHub and get read access to the private repositories. Each release is one tagged commit, so updating is a pull.
$ git clone git@github.com:themesdev/linen-next.git
$ cd linen-next && pnpm install
$ pnpm dev # the demo content, until you connect Sanity
$ pnpm seed # then import it into your own dataset- 01Buy a licensePay once. The license belongs to your organisation; owners and admins hand out the seats.
- 02Connect GitHubIn your account, sign in with GitHub once. We learn only your username, and invite it read-only to both repositories.
- 03Pull updatesUpdates are free for life. Access follows your license, and the zip stays in your account next to it.
Pay once. Both editions.
Unlimited projects, private, commercial and for clients, with every future update of both editions. Prices exclude VAT; we sell to businesses. License details
For a freelance developer, or a practitioner who builds their own site.
Choose SoloA small studio building practice sites: everyone gets their own seat.
Choose Team
A registered Dutch company, KvK 01129853. Questions before you buy? Ask me.
Paying
Through Mollie: card, Apple Pay, iDEAL, Bancontact or PayPal. A proper invoice for every order, with EU reverse charge.
Updates
Offset 1.1.3 came out on . 19 releases across our themes in the last 30 days, all free for buyers.
Track record
400+ teams and developers have bought from themes.dev since 2020. Their licenses now live in their accounts here.
What's new
Updates for both editions, free.
v1.0.0
Latest
The first release of Linen, the Astro theme for health practices.
Astro
- Home on a meadow photo, with the next openings and the treatments as five photo columns under their colour keys, the insurers, the practice in figures, the first visit beside the patient plan, a patient's words, the team, the journal and a booking band with today's hours.
- Treatments, a page per treatment in its own colour (is this for me, a session, the prices, who gives it, questions), the first visit minute by minute with the floor plan, prices and insurance, the team with a filter by treatment and a page per person (what they treat, how they work, languages, next openings, their notes), the journal, questions, contact with both locations, a booking page, privacy (with health records) and terms.
- Three presets: Linen (light, and a warm ink dark mode), Tide and Hearth. Generated demo photos (fictional people, no brands), every person and room slot ready for your own photos at 2×.
- MedicalClinic, Service, FAQ, BlogPosting and breadcrumb structured data, a sitemap, RSS, llms.txt and Markdown posts.
Next.js + Sanity
- Home on a meadow photo, with the next openings and the treatments as five photo columns under their colour keys, the insurers, the practice in figures, the first visit beside the patient plan, a patient's words, the team, the journal and a booking band with today's hours.
- Treatments, a page per treatment in its own colour (is this for me, a session, the prices, who gives it, questions), the first visit minute by minute with the floor plan, prices and insurance, the team with a filter by treatment and a page per person (what they treat, how they work, languages, next openings, their notes), the journal, questions, contact with both locations, a booking page, privacy (with health records) and terms.
- A Sanity Studio with a page builder and documents for treatments, practitioners, locations (with opening hours), openings and journal posts; Presentation with draft mode; a publish webhook.
- Three presets: Linen (light, and a warm ink dark mode), Tide and Hearth. Generated demo photos (fictional people, no brands), every person and room slot ready for your own photos at 2×.
Questions
Do I get both editions?
Yes. Linen is one product: every license includes the Astro theme and the Next.js + Sanity edition, as a zip and as two private GitHub repositories. Use either or both in any project your license covers.
Which edition should I use?
The Astro edition if a developer keeps the site: the treatments, prices, team and opening hours are in one typed file, the posts in Markdown, and the output is plain static HTML on any host. The Next.js + Sanity edition if the practice keeps it: whoever runs the front desk changes a price, an opening time or a new colleague in the Studio, with a live preview, and nobody touches code.
Does it work with our booking system?
Yes, if your booking system has a booking page. Put its address in the site settings (or the Studio) and every Book button and time slot goes there. Without one, the booking page sends a request with the treatment, location and times that suit, and the practice calls back to confirm.
Does the site handle patient records?
No, and it doesn’t ask for them. The forms take a name, contact details, a treatment and the times that suit; what patients tell you about their health belongs in your practice system. The privacy page is a sample with a section on health records: check it with someone who knows your country’s rules before you publish.
Do I need a paid Sanity plan?
No. Sanity’s free plan is enough for this theme. The README walks you through the project, tokens and the seed script in about ten minutes.
How does the GitHub access work?
In your themes.dev account, connect your GitHub account once by signing in with GitHub. You then get a read-only invitation to themesdev/linen-astro and themesdev/linen-next. Every release is a tagged commit there. Access follows your license: a seat you lose or a refund ends it. The zip stays in your account either way.
Can I build sites for clients with it?
Yes, in unlimited projects. A site you build with Linen for a practice is theirs: they may own, host, edit and keep running it without a license of their own. They may not take Linen out of that site to build other sites.
Can I see it before buying?
Yes. The live demo is the Astro edition with every page, and the screenshots on this page show them in light and dark. The demo practice, Alder, and everything in it are invented: people, addresses, insurers, quotes and figures. The photos are generated and show fictional people; the maps, the floor plan and the insurer wordmarks are drawn.
Can I use our own photos and colours?
Yes. Every place a person or a room appears takes a photo at a fixed ratio; the README lists the export sizes. The five treatment colours come from the preset: switch to Tide or Hearth, or change them in one file, and every page follows.
Do you charge VAT?
We sell to businesses. Dutch businesses pay 21% VAT; businesses elsewhere in the EU with a valid VAT number pay none (reverse charge); outside the EU there is no Dutch VAT. You get a proper invoice by email.
Is Linen an official Astro, Next.js or Sanity product?
No. Linen is made by themes.dev and builds on the open-source Astro, Next.js, Tailwind CSS and Sanity projects; it is not affiliated with them.
Put your practice on Linen.
From €49 for one person to €349 for your whole company. Both editions, pay once, lifetime updates.

















