The whole site in two files

No server or plugin chores: just the Eile program and an SQLite database. There’s no PHP or MySQL to install, and one command runs the site and its manager.

curl -fsSL https://github.com/a-sharapov/eile/releases/latest/download/install.sh | bash

Linux and macOS, x64 and arm64 v0.1.0-alpha.9.1 alpha GPL-3.0

Screenshots show the kitchen studio site from the cookbook.

Where the time usually goes

The site itself comes together quickly. The time goes on everything around it: servers, plugins, moves and edits the user asks for by phone. Here is what Eile takes off your hands.

What the two files replace

A usual site rests on a web server, PHP, a database and a dozen plugins, each with its own updates and failures. In Eile the whole site is an executable and an SQLite database. Those two are all you update, move and back up.

Usually

a typical PHP CMS site

  1. Web server and its config
  2. PHP with extensions
  3. Database server
  4. The CMS itself
  5. Cache plugin
  6. SEO and sitemap plugin
  7. Forms plugin
  8. Backup plugin
  9. Cron for background jobs
  10. Certbot for HTTPS

Every layer brings its own updates, settings and ways to break.

Eile

the whole site

cmsexecutable
server, manager, Svelte compiler, migrations, HTTPS
site.dbSQLite database
pages, templates, media, users, form entries

cms backup copy.db backs up the whole site into one file. To move, copy two files.

A fast site without a cache plugin

No cache, CDN or compression to tune. The server sends a page as ready HTML from memory, the cache clears exactly where something changed, and JavaScript reaches the page only when it has to.

Measured on a 3,000-page site: median (p50), server time without network. Logarithmic scale. How it was measured: docs/roadmap.md

This page runs on Eile too Measured by your browser, right now.

HTML
…
island scripts
…
server reply incl. network
…
Two-phase cache
The whole page sits in memory, while live parts such as forms or a cart are drawn on every request.
Precise invalidation
Editing a page or a component clears only the pages that depend on it.
ETag, br and gzip
Compressed copies are prepared ahead; a repeat visit gets a 304 with no body.
JavaScript only in islands
A page without islands ships no script at all. This one has three islands (copy, menu and the probe above) and one line in the head that remembers your theme.

Users edit on their own, and any edit can be undone

The whole site shows as a tree, the way it nests. Text is built from blocks, pictures come from the media library, and a page goes live at once or on a schedule. If an edit goes wrong, the history brings back any version with one click.

Site overview in the manager: every page in one table, with address, template, menu and publishing edited right in the row Site overview in the manager: every page in one table, with address, template, menu and publishing edited right in the row
Page tree
An id on every page, drag and drop, and drafts in italics.
Text in blocks
Paragraphs, headings and images mixed with components; the parameter form builds itself.
Scheduled publishing
A page goes live and comes down on its own at the set time.
Revision history
Word-level diffs between versions and a one-click restore.
Quick jump
Ctrl K takes you to any page, element or file in a couple of keystrokes.
Media library
Smaller copies of each picture for different screens are made for you, and the alt text fills in when you insert it.

Layouts with no build and no deploy

Templates are plain Svelte, edited right in the browser. Save, and the site has changed: no npm, no bundler, no upload. A template with an error won’t save, so a typo can’t take the site down.

Blog template
<script>
  import Layout from '$components/Layout';
  import { link, listing } from '$core';

  let { page, site } = $props();
  const posts = listing(page.id, { perPage: 10 });
</script>

<Layout {page}>
  <h1>{page.longTitle || page.title}</h1>
  {#each posts.items as post (post.id)}
    <a href={link(post.id)}>{post.title}</a>
  {/each}
  <p>{site.custom.phone}</p>
</Layout>
Edits go live at once
Templates and components compile on save, with no build and no deploy.
A mistake can’t take the site down
If it doesn’t compile, the save is rejected with the error’s location and the site keeps the previous version.
JavaScript on demand
Pages go out as plain HTML. An island component hydrates in the browser only when included as one.

A first draft from a few words

An empty field no longer holds up the work. The wand by a field drafts a title, a description, page text or even a Svelte template. Say what you need, look at the draft, then insert it or ask for another.

The “Generate with AI” box in the template editor with a request to add a booking button The “Generate with AI” box in the template editor with a request to add a booking button
  1. Click the wand by a field or press Alt+I.
  2. Write a few words: “shorter”, “a one-line summary”, “add a booking button”.
  3. Look at the draft, then click Insert or Another one.
Text and code
Titles, descriptions, page text, and also templates, components and plugins.
Knows your site
The request carries the site name and language, the field and where it sits, so a few words are enough.
Your model
DeepSeek, OpenAI or any model with the same API, even a local one. The key stays on the server and never goes into a site backup.
Your rules
Set the tone and writing rules once in settings, and they go with every request.

Everything you’d install plugins for is built in

SEO and AI discoverability, forms with an inbox, search, backups, HTTPS and translations. Nothing to pick, combine and update one by one: they come and update together with Eile.

Usually installed In Eile

Discoverability

an SEO plugin canonical, Open Graph and JSON-LD with no setup
a sitemap plugin sitemap.xml and robots.txt with rules for AI bots
usually not there at all llms.txt and a Markdown version of every page for AI
a redirects plugin old addresses redirect to new ones automatically after a rename

Forms and inbox

a forms plugin a form is plain HTML5 markup, entries land in the manager with statuses
an SMTP plugin and a bot notifications to Telegram and email
a CAPTCHA spam protection without a CAPTCHA: honeypot, stamp and rate limit

Site search

a search plugin or an external service search that knows Russian word forms («книги» finds «книгу»), with highlighted snippets

Peace of mind

a revisions plugin revision history with diffs and restore
a backup plugin and cron scheduled backups of the whole site
checking links by hand diagnostics: broken links, pages without a description, images without alt

Server

Certbot and a proxy HTTPS on its own through Let’s Encrypt, no proxy needed
updating files over FTP cms update fetches a new version and checks SHA256
a monitoring service failure alerts to Telegram and email

Languages

a multilingual plugin site branches in different languages and translation dictionaries in the manager

Your first site today

One command sets up a ready site: a blog, a portfolio, a company site, a showcase or a shop.

  1. Install

    curl -fsSL …/install.sh | bash

    The script picks the build for your system, checks SHA256 and puts cms on your PATH.

  2. Create a site

    cms new blog --db site.db

    Starters: blog, portfolio, company, showcase, shop. Without one you get an empty database with a welcome page.

  3. Run

    cms --db site.db

    The site and manager open on localhost:8080. On first start the server prints a link to create the admin.

Step by step, from an empty folder to a site online: Cookbook

curl -fsSL https://github.com/a-sharapov/eile/releases/latest/download/install.sh | bash

Linux and macOS, x64 and arm64 v0.1.0-alpha.9.1 alpha GPL-3.0

This is an alpha: you can build sites today, but breaking changes may land before 1.0. Run cms backup before updating.