Introduction to Raytha
Raytha is a free, MIT-licensed content management system built on .NET 10 and PostgreSQL. You model your content in the admin, write Liquid templates in the browser, and get a server-rendered public site and a headless REST API for the same data. You host it yourself.
The model in one pass
Everything in Raytha is built from a small set of parts. Learn these and the rest of the docs read quickly.
| Part | What it is |
|---|---|
| Content type | A kind of content, such as posts or products. It owns a list of typed fields (single line text, rich text, date, attachment, relationship and so on). A new content type starts with a title field, a content field and an "All" view. |
| Content item | One record of a content type. It has a published version and, optionally, a draft, and it keeps revisions. Its public address is its route path, built from the content type's route template. |
| View | A saved list of items for one content type, with columns, a filter and a sort. A published view is a public page at its own route (a new content type's view is served at /<developer-name>). |
| Web template | A Liquid template stored in the database and grouped into a theme. Templates render content item pages, view pages, layouts and site pages. Edit them in the admin or push them from files. |
| Site page and widgets | A one-off page (home, about, a landing page) assembled from widgets in a drag-and-drop page builder. Each widget is rendered by a widget template that declares its own fields. |
| REST API v1 | A headless API under /raytha/api/v1, authenticated with an X-API-KEY header. Reference docs are served by your own instance at /raytha/api. |
| Raytha Functions | JavaScript that runs on a V8 engine inside the server. A function can answer an HTTP route, be called from a Liquid template, or react to a content item being created, updated or deleted. |
| Webhooks | Signed HTTP calls Raytha makes to your systems when something changes. See Webhooks. |
How a public request becomes a page
The public site has no static files to build. A visitor requests a path, and Raytha looks that path up in its routes table. The route points at a content item, a view, a site page or a function. Raytha loads that record, picks the web template assigned to it, assembles the template with its parent layouts, and renders it with Liquid. The details are in Architecture.
Everything under /raytha belongs to Raytha
The admin is a single-page app at /raytha. The REST API and its reference live under /raytha/api. Everything else is your public site.
What is new in 2.0
- PostgreSQL only. SQL Server support is gone. There is one provider and one set of migrations.
- A new admin. The admin is a React app served from a bundle committed to the repository. A handful of pages (error pages, logout, the SAML and JWT sign-in handoffs, theme export and the function test runner) are still server-rendered.
- .NET 10, with the repository's
VERSIONfile as the single source of the product version./healthzand the REST API ping report it. - Outbound webhooks with HMAC-signed deliveries, retries and a delivery log.
- Email log for every message the server tries to send.
- Health endpoints at
/healthzand/healthz/ready. See Health checks. - Site pages and widgets, proxy trust settings (
TRUSTED_PROXIES), and a separate Manage Media permission.
Coming from 1.5.0? Read Upgrading from 1.5.0 to 2.0 first. The upgrade rewrites some stored data.
Who Raytha is for
- Developers who want a CMS they can read. The code is a conventional ASP.NET Core solution with clear layers, and the public site is plain Liquid.
- Teams that want editors and developers in one tool. Editors work in the admin. Developers pull a theme to files, edit it in git, and push it back.
- Projects that need both a website and an API. The same content serves server-rendered pages and JSON.
It is a good fit if you are comfortable running a .NET container and a PostgreSQL database. It does not ship a hosted service. If you want help setting up or extending a deployment, you can ask for consulting through support.
Gotchas
- Raytha stores templates, content and settings in PostgreSQL. A backup of the database is a backup of your site. Uploaded media lives in your file storage and needs its own backup. See Backups and restores.
- Links in emails and absolute media URLs are built from the Website URL setting, never from the request's
Hostheader. Set it to your public address.
Next steps
- Quickstart: run Raytha and publish your first content item.
- Configuration: every environment variable the app reads.
- Building templates: write the Liquid that renders your site.
- REST API overview: read and write content from your own code.