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

City of Juniper Falls: a self-hosted CMS for local government, on open-source .NET

A local city government website for a fictional Texas city: how do I... services, public meetings with agendas and minutes, the mayor and council, departments, public notices, news releases, a community calendar and iCal and RSS feeds, built on Raytha, an open-source .NET CMS for city government, by an AI agent with the CLI in under an hour.

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
City of Juniper Falls: a self-hosted CMS for local government, on open-source .NET
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 / 10The home page: an alert banner, a search box and the tasks residents come to do
The write-up

For each Raytha use case we take a realistic brief, hand it to an AI agent with the raytha CLI, 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 local city government website: services residents can look up by task, public meetings with agendas and minutes, the mayor and council, city departments, public notices, news releases, a community calendar, and feeds residents can subscribe to.

If you are looking for a self-hosted CMS for local government or an open-source .NET CMS for city government, this is what a city website looks like on Raytha. The agent built it on a fresh Raytha 2.0.1 instance. Nobody opened the admin. Every template, content type, item, page, menu and function went in through the CLI, from files in a directory.

Why local governments look for a self-hosted CMS

City and county websites are usually run by a small IT team and a handful of communications staff, and the questions they ask about a CMS tend to be the same. Here is how Raytha answers them:

  • It runs where you choose. Raytha is a .NET 10 application with PostgreSQL, shipped as a Docker image, so it can run on your own servers on-prem, in your own cloud account, or in a government cloud region you already use.
  • You own the code. Raytha is MIT-licensed. The templates, content types and content in this example are plain files you can keep in your own repository, so the site does not depend on one vendor.
  • No per-seat pricing. It is open source, so there is no license fee per editor, per department or per page view.
  • It fits an IT department that runs .NET. Teams that already run ASP.NET Core and PostgreSQL can host, patch and extend it with tools they know.
  • Templates you control. Every page is a Liquid template in your hands, so accessibility fixes do not wait on a vendor. This demo uses a skip link, landmarks, one heading per page, visible keyboard focus, labelled filters and alt text. The U.S. Department of Justice's 2024 ADA Title II rule asks state and local government websites to meet WCAG 2.1 level AA, by April 26, 2027 for places with 50,000 or more people and by April 26, 2028 for smaller ones. A template you can edit makes that work easier, but conformance still has to be tested on your own site.
  • Staff sign-in. Raytha supports SAML and JWT sign-in, so the staff who edit the site can use the identity provider the city already has.

If you are replacing an older .NET platform, see Raytha vs DNN (DotNetNuke) and Raytha vs Kentico.

What was built

City of Juniper Falls is the website of a fictional Hill Country city in Texas with about 84,000 residents, a council-manager government, a mayor and six council districts. The site has:

  • A home page built around what residents come to do: a search box, popular searches, eight top tasks, upcoming meetings, the latest public notices, news, events, the council and the city at a glance.
  • An alert banner across the top of every page for road closures and emergencies. Staff turn an alert on or off with a checkbox, and an alerts page lists the current ones.
  • "How do I..." service pages for 16 services, filtered by what you want to do: pay, apply, report, request or find. Each service lists the cost, how long it takes and the department to call. Paying a bill, applying for a permit or reporting a pothole links out to the city's existing systems, so there are no payment or registration forms on the site.
  • Public meetings of the City Council and five boards and commissions, filterable by body and by upcoming or past. Each meeting has the date, time, place, what is on the agenda, the agenda and minutes as PDFs, the video link once it is posted, and how to comment.
  • A mayor and council page with each member's district, role, term, committees and contact details, and a page for each official.
  • Boards and commissions, with when they meet, how many seats they have and their meetings.
  • Ten department pages with the director, phone, email, address and hours, the services the department runs and its news.
  • Public notices for hearings, bids and requests for proposals, ordinances, elections and construction, each with its posted date, deadline and the notice as a PDF.
  • News releases by topic, and a community calendar of events by category.
  • A trash and recycling page with pickup days by zone, what goes in each cart, holiday schedule changes and answers to common questions.
  • An accessibility statement, a contact page with who to call for what, and a search page that searches services, departments, meetings, notices, news and events at once.
  • Two feeds residents can subscribe to: an iCal calendar of public meetings and an RSS feed of public notices.

The design is calm and civic: a navy header band with a skyline of the city, a warm off-white page, white cards, one blue for links and a gold accent kept for the alert banner and the main buttons. Headings are set in Source Serif 4 and everything else in Public Sans, a typeface made for government websites. The portraits, news images and the agenda, minutes and notice PDFs are generated by a script, so every image and document is license-free. On a 390px phone the navigation becomes a menu button, the top tasks stack and the filters sit above the lists.

How the alerts, meetings and feeds work

  1. An alert is its own content type with a level, a message, a link and an "Active" checkbox. The base layout asks for active alerts on every page, so ticking the box puts the banner on the whole site and unticking it takes it down. There is nothing to deploy.
  2. A meeting has a relationship field to its board, a date, a status dropdown, and attachment fields for the agenda and minutes. The meetings list and each board's page pull meetings with get_content_items, so a clerk posts an agenda by uploading one file to one item.
  3. The meetings calendar and the notices feed are two Raytha Functions with HTTP triggers at /feeds/meetings.ics and /feeds/notices.rss. They read the content with the API and return iCal and RSS, so residents can add every public meeting to their own calendar app and follow notices in a feed reader.

Features, and the Raytha features behind them

Feature How it is built
Departments, boards, officials, services, meetings, news, notices, alerts and events Nine content types from one schema document. Services, meetings, news and notices use relationship fields to their department or board, with dropdowns for service action, meeting status, news topic, notice kind, alert level and event category, checkboxes for top tasks, featured news, active alerts and free events, dates, attachments for portraits, images, agendas, minutes and notices, and rich text for bodies.
77 seed items Content import from JSON Lines. Items point at their department or board by name, and the portraits, images and PDFs are uploaded during the import.
Site-wide alert banner The base layout queries for alerts with the active checkbox ticked, on every page.
Services by task, meetings by body, notices by kind, news by topic, events by category List views with Liquid templates that read ?action=, ?body= and ?when=, ?kind=, ?topic= and ?category=.
Service, meeting, official, board, department, notice, news and event pages Detail templates per content type that pull related items with get_content_items.
Meetings calendar and notices feed Two Functions (JavaScript) with HTTP triggers at their own routes, returning iCal and RSS.
Site search A site page whose template queries six content types with get_content_items filters.
Home, trash and recycling, accessibility and contact Site pages built from 10 custom widget templates (hero with search, city at a glance, subscribe, page heading, text, contacts, questions and answers, schedule table, pickup zones, what goes in each cart).
Navigation Two menus: the main navigation and the footer. The footer also lists the departments straight from the content.

The brief

This is the brief, as given to the agent.

Build the website of a fictional city government on a fresh Raytha instance with the raytha CLI. No clicking around the admin.

Look and feel

  • Clear, calm and trustworthy. Built for residents first: big tap targets, plain language, high contrast. No wide display fonts.
  • Responsive. It has to look good on a phone as well as a desktop.
  • Accessible markup: landmarks, a skip link, visible focus, alt text, labelled form controls.

Content and pages

  • A home page with an alert banner, search, top tasks, meetings, public notices, news and events.
  • "How do I..." service pages (pay, apply, report, request, find), city departments with contact details, the mayor and council.
  • Public meetings with agendas, minutes and video, boards and commissions, public notices (hearings, bids, ordinances), news, a community calendar.
  • Trash and recycling schedule, an accessibility statement, and a contact page.
  • Feeds residents can subscribe to: a calendar of public meetings and an RSS feed of notices.
  • No payment or registration forms. Paying a bill or reporting an issue links out to the city's existing systems.

Done means

  • raytha check passes with no broken routes.
  • Screenshots of the result on desktop and mobile, and a walkthrough video.
  • A kit in the examples repository that rebuilds the site on a fresh install.

How long it took

Under an hour of agent time, from an empty install to raytha check passing on all 94 routes, including the visual design, the generated portraits and documents, the two feeds and writing all 77 items.

Rebuild it yourself

The theme, schema, seed content, image and document generator, page definitions, menus and feed functions are in the raytha-examples repository, with a build.sh that rebuilds the whole site into any Raytha 2.x instance. Point it at your site with RAYTHA_URL and RAYTHA_API_KEY and run it, then replace Juniper Falls with your own city.

Share Post LinkedIn

Build yours on Raytha

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