New: theme for museums, galleries and archives, for Astro and Next.js + Sanity
Vitrine
The site for a museum, a gallery, an archive or a library of things: whether you are open today, what it costs, and the objects themselves, each with a museum label, in two editions: Astro, or Next.js with a Sanity Studio. 39 pages, 22 sections and 2 presets, light and dark, WCAG 2.2 AA.
Pay once · Both editions · Lifetime updates


- 39
- pages
- 22
- sections
- 2
- presets
- 2
- editions, one license
- 0
- axe violations
- 17
- screen widths checked
Home, what’s on, an exhibition, the collection, an object, your visit, the library of things and Friends, ready for your museum.
Every page as it ships, with the invented Merrin Collection: one family’s household things, kept in an old cutlery works in Sheffield. 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 the hang becomes one column of objects with their labels, the collection’s search and filters stack above a two-column grid, the week’s hours sit in one table with today marked, and the header links fold into a menu.



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
- AstroObjects and exhibitions in Markdown, one file each with the label in the front matter; hours, tickets, tiers, people and events in one typed file; page copy in another
- Next.js + SanitySanity Studio with a page builder and documents for objects, exhibitions, galleries, ways in, people and events
- Opening hours
- AstroOne row per weekday per way in; “Open today until 17:00” is filled in the visitor’s browser, in the museum’s time zone
- Next.js + SanityThe same, per way in, with the time zone in the Site settings
- Exhibitions
- AstroNow, next and past follow from the day you build: rebuild when one opens or closes
- Next.js + SanityThe same, worked out from today: pages rebuild at most a minute after the day changes
- Demo content
- AstroIn the repository
- Next.js + SanityA seed script imports every object, exhibition, gallery, person, event 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
- AstroContact, archive appointment and newsletter post to the addresses you set, or to an optional Cloudflare Worker that forwards them and fails closed without a destination
- Next.js + SanityRoute Handlers that forward to your endpoint, fail closed without one and log no field values
- JavaScript
- AstroSmall scripts: the menu on phones, the light/dark switch, the open-today lines, today’s row in the week, and the collection’s filters and pages
- Next.js + SanityThe same small parts as client components; every page renders on the server
- Lighthouse, mobile
- Astro95–97
- Next.js + Sanity95–97
- Deploys to
- AstroCloudflare Workers, Netlify, Vercel or any static host
- Next.js + SanityVercel, or Cloudflare Workers through OpenNext
- Repository
- Astrothemesdev/vitrine-astro
- Next.js + Sanitythemesdev/vitrine-next
| Aspect | Astro | Next.js + Sanity |
|---|---|---|
| Framework | Astro 7, static output | Next.js 16, App Router and React Server Components |
| Content | Objects and exhibitions in Markdown, one file each with the label in the front matter; hours, tickets, tiers, people and events in one typed file; page copy in another | Sanity Studio with a page builder and documents for objects, exhibitions, galleries, ways in, people and events |
| Opening hours | One row per weekday per way in; “Open today until 17:00” is filled in the visitor’s browser, in the museum’s time zone | The same, per way in, with the time zone in the Site settings |
| Exhibitions | Now, next and past follow from the day you build: rebuild when one opens or closes | The same, worked out from today: pages rebuild at most a minute after the day changes |
| Demo content | In the repository | A seed script imports every object, exhibition, gallery, person, event 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 | Contact, archive appointment and newsletter post to the addresses you set, or to an optional Cloudflare Worker that forwards them and fails closed without a destination | Route Handlers that forward to your endpoint, fail closed without one and log no field values |
| JavaScript | Small scripts: the menu on phones, the light/dark switch, the open-today lines, today’s row in the week, and the collection’s filters and pages | The same small parts as client components; every page renders on the server |
| Lighthouse, mobile | 95–97 | 95–97 |
| Deploys to | Cloudflare Workers, Netlify, Vercel or any static host | Vercel, or Cloudflare Workers through OpenNext |
| Repository | themesdev/vitrine-astro | themesdev/vitrine-next |
What's inside
39 pages from 22 sections.
Each page is a short list of sections: the hang, the exhibition, the ways in, the price list, the tiers, the collection and the rest. Each object is one file or document holding its label and its story, so the same label shows on the home page, the collection, the exhibition and the object’s own page.
- Home
- One object on the first screen with its museum label, and whether the galleries are open today. Then five objects from the collection hung like a museum wall, each with its label, the exhibition on now, the three ways in (the galleries, the archive reading room and the library of things) with their hours, and the Friends with the newsletter sign-up.
- What’s on
- The exhibition on now, the ones coming next and the past ones, and the talks, tours and workshops around them.
- A page per exhibition
- The title, dates, room and price; the objects in the case, each with its label; the essay with a pull quote; the curator and their note; the events; questions. Four in the demo.
- The collection
- Every object with its label, with search and filters by gallery, material and decade, twelve to a page.
- A page per object
- The photograph with the full label: who made it, when, what it is made of, what it cost new, its size, where it came from and where to see it. Then its story, related objects, and the gallery it is in. Twenty-four in the demo, each also as Markdown.
- Plan your visit
- Open today and the week’s hours with today marked, tickets and concessions, questions, getting here with a drawn street map, and access.
- Friends and the library of things
- Three membership tiers, what the money pays for, questions and a way to give. The library of things: the things to borrow, labelled like the collection with the fee where the cost would be, how borrowing works in four steps, the person who runs it, and questions.
- About, contact and the rest
- The family and the works, figures, what the museum does, the building and the four staff; contact with the front desk, archive and press desks beside a form that also books an archive appointment; a sample privacy page for the demo museum, the thank-you page and a 404.
Two looks, one line apart.
Everything a section draws comes from the preset’s tokens: colours, type, space and corners. Vitrine is stone paper and enamel blue, light and dark; Archive is a dark green-grey board with copper. Contrast is 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 39 pages, in light and dark, at desktop and phone widths, in both editions, and on the Archive home page.
- Fast on a phone
- Lighthouse performance on mobile: 95–97 for the Astro edition, 95–97 for Next.js, on the home page, the collection and an object. Every photo is served at twice its drawn size for sharp screens and at its own size for the rest.
- Checked at 17 widths
- The main pages measured from 320 to 5120 pixels in both modes, and looked over by reviewers in six rounds: no sideways scrolling, no clipped text.
- Hours that are true
- Without JavaScript every way in shows its week’s hours, which are always true. With it, the visitor sees whether it is open today and until when, or when it opens next, worked out in the museum’s time zone, not the visitor’s.
- Structured data for a museum
- The museum as a Museum with its address and opening hours; every exhibition an ExhibitionEvent; talks and tours as Events; objects as CreativeWork; ticket and Friends’ prices as offers; FAQ pages and breadcrumbs. A sitemap, llms.txt, Open Graph images and every object and exhibition 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/vitrine-next.git
$ cd vitrine-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
A small studio building sites for museums, galleries and archives: 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
Ledger 1.1.4 came out on . 26 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 Vitrine, for museums, galleries, archives and libraries of things.
Astro
- Home, What's on, an exhibition page with its essay, the collection with search and filters, an object page with its full label and story, Plan your visit, Friends and support, the library of things, About and Contact.
- Every object photographed the same way on one grey paper, with a museum label: who made it, when, where to see it and what it cost new.
- Opening hours live in the visitor's browser ("Open today until 17:00"), in the museum's time zone.
- Light and dark, with a toggle that remembers your choice; the Archive preset, dark only.
Next.js + Sanity
- Home, What's on, an exhibition page with its essay, the objects in the case and the curator, the collection with search, filters (gallery, material, decade) and pages, an object page with its full label and story, Plan your visit, Friends and support, the library of things, About and Contact.
- Every object photographed the same way on one grey paper, with a museum label: who made it, when, where to see it and what it cost new.
- Opening hours live in the visitor's browser ("Open today until 17:00"), in the museum's time zone.
- Sanity Studio: a page builder with Vitrine's own sections and the section library's, documents for objects, exhibitions, galleries, ways in with their hours, people and events, the Site document, Presentation with draft mode, and the demo content to import (
pnpm seed).
Questions
Do I get both editions?
Yes. Vitrine 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: every object and exhibition is a Markdown file, the hours and prices are in a typed file, and the output is plain static HTML on any host. The Next.js + Sanity edition if the museum’s staff keep it: the curator adds an object with its label, or an exhibition with its essay, in the Studio, with a live preview, and nobody touches code.
We are a gallery or an archive, not a museum of everyday things. Does it fit?
The demo is a small museum with an archive reading room and a library of things, but nothing in the layout depends on what your objects are. A label holds a maker, a date, a material, a size, where it came from and where to see it; leave out the cost new if it means nothing for your collection. The library of things and the archive are pages and sections you can drop. The Archive preset gives a darker room.
How many objects can the collection hold?
As many as you have files or documents for. The collection page lists them featured first, then by decade, with search, filters by gallery, material and decade, and twelve to a page. The demo has twenty-four.
What happens to the forms?
The contact form (which also books an archive appointment) and the newsletter sign-up are plain forms that work without JavaScript, with a hidden field that catches bots. In the Astro edition they post to the addresses you set: a form service, your CRM, or the optional Cloudflare Worker that forwards them. In the Next.js edition they post to the site, which forwards the fields to the address you set; without one it accepts nothing. Neither edition stores what people send.
Does it sell tickets or memberships?
No. Vitrine shows the tickets, concessions and Friends’ tiers with their prices. Put your ticketing tool’s address in the settings and every ticket button goes there; the membership buttons open the contact form with Friends and giving chosen.
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.
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/vitrine-astro and themesdev/vitrine-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 Vitrine for a museum is theirs: they may own, host, edit and keep running it without a license of their own. They may not take Vitrine 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 Merrin Collection and everything in it is invented: people, objects, addresses, phone numbers, prices and figures. The photos are generated and show fictional people.
Can I use our own photos and colours?
Yes. Every object, room and person takes a photo at a fixed size; the README lists them. For the objects to read as one collection, photograph them the way the demo does: on one sheet of plain grey paper, from the same height, with one soft light, and match the mount colour in the preset to your paper. The colours come from the preset: switch to Archive, or change the tokens 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 Vitrine an official Astro, Next.js or Sanity product?
No. Vitrine 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 collection on Vitrine.
From €49 for one person to €349 for your whole company. Both editions, pay once, lifetime updates.

















