Platform CLI Use cases
Learn
Developer docs User guide Quickstart CLI and AI agents Blog
Company
Services About Contact Links Get started
Government and public sector

Ossingford Public Library: a self-hosted CMS for public libraries — an open-source .NET library website

A public library website for a fictional county library: branches with today's hours, a weekly program planner, new arrivals on a shelf, reading lists, digital resources A to Z, library news, and members-only pages for cardholders and staff. Built on Raytha, a self-hosted, open-source .NET CMS for public libraries.

Build time
Under an hour
Built with
Raytha 2.0.1 and the raytha CLI 0.1.1
Industry
Government and public sector
Rebuild
One script, from GitHub
Ossingford Public Library: a self-hosted CMS for public libraries — an open-source .NET library website
Walkthrough

See it in action

A short, silent tour of the finished site, recorded from the real pages.

Silent walkthrough, 1080pOpen the MP4
The site

Take the tour

10 screens from the finished site, on desktop and on a phone. Use the arrow keys, swipe, or open any screen full size.

01 / 10Home: today's hours for every branch on a catalog card, read from each branch's fields on the server
The write-up

For each Raytha use case we take a realistic brief, build the site on a fresh Raytha instance, and publish what comes out: the site, the files behind it, and a kit you can use to rebuild it yourself. This one is a public library website — the page a parent opens to check when storytime starts, the place a commuter looks up whether the branch near the station is open tonight, and the sign-in a cardholder uses to find the e-book app and the research databases. The same build works for a library's own web team or county IT department, or for an agency that builds sites for libraries and other public institutions.

If you are looking for a self-hosted CMS for public libraries, or an open-source .NET CMS for libraries, this is the kind of site that fits: branches with weekly hours, programs, new arrivals, reading lists, digital resources and library news as structured content, server-rendered pages, and members-only pages for cardholders and staff built on Raytha's own user accounts and groups. Built on a fresh Raytha instance, with no client-side app in the layout.

Ossingford Public Library is fictional. The library, its county and town, branches, people, books, authors, providers and figures are invented and labeled as such, and phone numbers use the 555 range. There are no payment, registration, hold or sign-up forms; the cardholder and staff accounts exist only for the demo.

A library site laid out like the card catalog

Most library sites open with a carousel and a search box for a catalog they do not run. This one opens with the questions people actually bring to a library website: is it open, what is on, what is new, and how do I get in to the e-books.

  • Today's hours on the home page. The hero is a catalog card listing every branch with its hours for today. The template reads the day of the week on the server and picks the right field from each branch, so the card is right every morning without anyone editing it. A branch with limited service is flagged on the card.
  • Branches as records. Four buildings and a Bookmobile, each with an address, phone, seven daily hours fields, features, a status and a status note. The branch page shows the week with today highlighted, the programs held there, and new titles on its shelves. The Bookmobile uses the same fields for its route stops.
  • A weekly program planner. Sixteen free, drop-in programs — storytimes, book clubs, the makerspace, tech help, the family history room — laid out Monday to Sunday, with today's column marked. Filter links for kids, teens, adults and older adults are plain links that the server filters; there is no script on the page. On the home page the same programs appear on a "date due" slip with each day and time in a red rubber stamp.
  • New arrivals on a shelf. Every new book, audiobook, film, record and Library of Things item is a record with author, format, shelf, call number, copies, holds and the branches that hold a copy. The home page draws them as book spines on a shelf, colored and sized from fields; each title page is a catalog card with where to find it, holds and a staff pick note.
  • Reading lists on index cards, each written by a named librarian and tied to a program or branch.
  • Digital resources A to Z. E-books, tutoring, research databases, language lessons and the newspaper archive, filed under their index letter like a catalog drawer. Free resources show their access details to everyone; resources that need a library card show a lock until a cardholder signs in.
  • Site search across programs, new arrivals, reading lists, digital resources, branches and news.

Design: the card catalog

The look comes from the furniture of an old reading room: warm card stock with ruled lines, a red rule across the top of each index card, a brass label holder for each menu item, manila date-due slips, and library green for the shelves. Text is set in Source Serif 4 for headings, Public Sans for body text and Courier Prime for call numbers, hours and stamps. There are no wide display fonts. Book covers, branch elevation drawings and news images are generated, so no real book, building or person is pictured.

Why a public library looks at a self-hosted CMS

  • Patron privacy. Libraries take reading privacy seriously, and many would rather not hand patron sign-ins and browsing to another vendor's platform. With Raytha the cardholder accounts, the pages they read and the server logs stay on infrastructure the library or its county controls, and the pages carry no tracking or advertising scripts.
  • Members-only pages without a second system. Raytha has public user accounts and user groups. The cardholder page, the access details for licensed databases and the staff room check CurrentUser.UserGroups in the template on the server, so an access code or a desk schedule is never sent to a browser that should not see it. The same feature covers a small staff intranet.
  • No per-seat pricing. Every branch manager, children's librarian, programming coordinator and volunteer who updates the site can have an editor account, and every cardholder can have a sign-in. Raytha has no seat licensing, which matters on a public budget with many part-time editors across many branches.
  • You own the code and the content model. Raytha is open source. Branches, programs, titles and resources are content types you define; the templates and content are files you can keep in your own repository, hand to the next agency, or rebuild on a new server when a contract ends, without asking anyone.
  • On premises and .NET, if your IT policy needs it. Many libraries are run by city or county IT departments that already host Windows and .NET systems and want public sites on their own network or private cloud. Raytha is ASP.NET Core with PostgreSQL, so it can run there. Single sign-on, role-based admin permissions and audit logs are built in. You can also deploy it on Railway.
  • Fast, plain pages for every device. Pages are rendered on the server and work without JavaScript, which suits older public computers, screen readers and phones on slow connections.
  • Works next to the catalog. The integrated library system stays where it is. Raytha runs the website around it, and its REST API and webhooks can carry new-arrival lists or event data in from other systems instead of someone re-typing them.

Raytha fits public libraries that want to own their stack: the code is open source, the content model is yours, and the site can run on servers your city or county IT team controls, with patron accounts kept in-house. If you would rather not run it yourself, Raytha can be fully hosted and managed for you under contract. Where another platform may suit you better is if you need a large plugin marketplace, or an all-in-one marketing suite with CRM and marketing automation built in. For fair comparisons with platforms public-sector and .NET teams often evaluate, see Raytha vs Kentico, Raytha vs DNN, Raytha vs Umbraco and Raytha vs WordPress.

How the members-only areas work

  • Two user groups: cardholders and staff. Staff accounts can see everything cardholders see; admins see everything.
  • Each digital resource has an audience field (everyone, cardholders, staff). The detail template reads it and the signed-in user's groups and renders either the access details or a lock panel with a sign-in link. The A–Z list marks cardholder resources with a lock and leaves staff tools out for everyone else.
  • My library at /my-library is a site page with its own template: signed out, it explains what is behind sign-in; signed in as a cardholder, it shows a library card with the cardholder's name and barcode, the e-book and database access pages, notices, and the museum and park pass table.
  • The staff room at /staff-room shows the desk schedule for the week, staff notices and the procedures and tools, only for staff accounts. A signed-in cardholder sees a short note pointing back to My library.
  • Sign-in uses Raytha's built-in login page, restyled to match. There is no registration form: in the story, accounts are created at the desk when someone gets a library card. For more on the pattern, see creating a members-only website.

What is in the kit

Six content types (branches, programs, new arrivals, reading lists, digital resources, news), two user groups, site pages for About, Get a card, Search, My library and the staff room, menus, and generated covers, branch drawings and news art — all rebuildable with one command from the kit in the examples repository. Route check: 85 routes checked, 0 failed.

Run it yourself

Run this on your own Raytha

Raytha is free and open source (MIT). Deploy your own copy on Railway, with PostgreSQL included, then load this site into it from the rebuild kit.

  1. Deploy RaythaThe Railway template sets up Raytha, PostgreSQL and a volume for uploads. Open the new site and create your administrator.
  2. Create an API keyIn the admin: People, Admins, open your account, then Create API key.
  3. Import the kitInstall the Raytha CLI, set RAYTHA_URL and RAYTHA_API_KEY, and run the kit's build.sh on the fresh site.

Prefer your own server? Raytha also runs with Docker.

Share Post LinkedIn

Build yours on Raytha

Free, open source and ready to deploy in minutes. Bring a brief and an AI agent.