| title | Installation | ||
|---|---|---|---|
| subtitle | Requirements, server setup, and getting started. | ||
| register |
|
Drop .md files in your docroot and they are served as fully rendered
HTML pages - no build step, no CMS, no database. Pages are generated on
first request and cached as static HTML. Content is portable, version
control friendly, and works with any deployment workflow.
For the full motivation behind lazysite, see Motivation.
lazysite uses standard CGI and error handler mechanisms available in most web servers.
- Apache 2.4 - supported, HestiaCP installer provided
- Apache without HestiaCP - configure
FallbackResourcemanually - Nginx - use
error_page 403 404to point to the CGI script - Any web server with CGI support and configurable error handlers should work
- Apache 2.4 with CGI support and
FallbackResourceconfiguration - Debian / Ubuntu (or any Linux with the Perl modules below)
libtext-multimarkdown-perllibtemplate-perllibwww-perl(for remote.urlsources and oEmbed)JSON::PP(Perl core - no separate install needed)
Optional:
libtemplate-plugin-json-escape-perl(required for the search index)
HestiaCP is supported with a dedicated installer. For other environments see the manual installation section below.
The installer registers lazysite as a HestiaCP web template. Once installed, apply it to any domain from the control panel and the processor and starter files are deployed automatically on rebuild.
git clone https://github.com/OpenDigitalCC/lazysite.git
cd lazysite
sudo bash install.sh --docroot /path/to/public_html --cgibin /path/to/cgi-bininstall.sh is a thin wrapper around install.pl; the Perl
installer reads release-manifest.json and tracks installed
state at {docroot}/lazysite/.install-state.json so re-runs
upgrade in place without losing content you've edited. See
Upgrading below.
Then in HestiaCP:
- Edit your domain
- Set the web template to
lazysite - Save and rebuild
For Apache without HestiaCP, install the Perl dependencies and configure the vhost manually:
apt install libtext-multimarkdown-perl libtemplate-perl libwww-perlCopy lazysite-processor.pl to your cgi-bin/ directory and make it executable:
cp lazysite-processor.pl /var/www/example.com/cgi-bin/
chmod 755 /var/www/example.com/cgi-bin/lazysite-processor.plCopy the starter files to your docroot:
mkdir -p /var/www/example.com/public_html/lazysite/templates/registries
mkdir -p /var/www/example.com/public_html/lazysite/layouts
mkdir -p /var/www/example.com/public_html/lazysite-assets
cp starter/lazysite.conf.example /var/www/example.com/public_html/lazysite/lazysite.conf
cp starter/registries/*.tt /var/www/example.com/public_html/lazysite/templates/registries/
cp starter/404.md /var/www/example.com/public_html/
cp starter/index.md /var/www/example.com/public_html/Add to your Apache vhost configuration:
DirectoryIndex index.html index.htm
FallbackResource /cgi-bin/lazysite-processor.pl
<Location /lazysite>
Require all denied
</Location>
<Directory /var/www/example.com/public_html>
Options -Indexes +ExecCGI
AllowOverride All
</Directory>Ensure the web server user can write to the docroot:
chown ispadmin:www-data /var/www/example.com/public_html
chmod g+ws /var/www/example.com/public_htmlThe setgid bit (s) ensures new subdirectories created by the processor
inherit the www-data group automatically.
Clone the repository and run the built-in development server:
git clone https://github.com/OpenDigitalCC/lazysite.git
cd lazysite
perl tools/lazysite-server.pl
Open http://localhost:8080/ to browse the starter site. No Apache configuration required for local development.
- Install a layout from
lazysite-layouts or write your own
layout.tt - Install a compatible theme (manager UI or zip upload) and set
layout:andtheme:inlazysite.conf - Edit
public_html/lazysite/nav.confto define your site navigation - Edit
public_html/index.mdfor your home page content - Add pages by dropping
.mdfiles anywhere in the docroot
Pages are available immediately at their extensionless URL:
public_html/about.md -> https://example.com/about
public_html/services/hosting.md -> https://example.com/services/hosting
public_html/services/index.md -> https://example.com/services/
Directory index pages are served when a trailing slash URL is requested.
Create dirname/index.md for any directory that needs an index page.
Four audience-specific briefings live under starter/docs/:
ai-briefing-authoring.md- writing contentai-briefing-layouts.md- designing layouts and themesai-briefing-configuration.md- configuring a siteai-briefing-development.md- working on the codebase
Feed the relevant briefing to an AI assistant at the start of a session to enable help without needing to explain the system each time. In Claude Projects, save it as a project document. For other AI tools, paste it as context at the start of the conversation.
Re-run install.sh against the same --docroot and --cgibin to
upgrade. Seed files you have edited (starter pages, docs) are
preserved; code files (processor, plugins, manager UI) are
always refreshed.
sudo bash install.sh --docroot /path/to/public_html --cgibin /path/to/cgi-binBefore applying an upgrade, the installer creates a backup
tarball at {docroot}/lazysite/backups/. Inspect the plan
before committing:
bash install.sh --docroot /path/to/public_html --cgibin /path/to/cgi-bin --dry-runbackup_retention in lazysite.conf controls how many
backups are kept (default 3; 0 = keep all).
bash install.sh --docroot /path/to/public_html --restoreRestores the most recent backup. For a specific backup:
bash install.sh --docroot /path/to/public_html --restore --backup /path/to/backup.tar.gzList available backups:
bash install.sh --docroot /path/to/public_html --list-backupsRestore does not touch runtime state (auth users, cache, logs) and invalidates the rendered HTML cache afterwards.
sudo bash uninstall.sh
Removes Hestia template files only. Deployed domain files are not touched.
public_html/
lazysite/
lazysite.conf <- site configuration
nav.conf <- navigation (YAML)
layouts/
LAYOUT/
layout.tt <- layout template
layout.json <- layout metadata (optional)
themes/
THEME/
theme.json <- theme manifest
main.css <- theme stylesheet
assets/ <- theme assets
manager/ <- manager chrome (internal; D013)
layout.tt
assets/manager.css
templates/
registries/
llms.txt.tt
sitemap.xml.tt
feed.rss.tt
feed.atom.tt
auth/
users <- built-in auth users
groups <- built-in auth groups
forms/
handlers.conf <- named dispatch handlers
smtp.conf <- SMTP connection settings
assets/
css/
img/
js/
cgi-bin/
lazysite-processor.pl
lazysite-auth.pl
plugins/form-handler.pl
plugins/form-smtp.pl
lazysite-manager-api.pl
404.md
index.md
- Authoring - Markdown, front matter, TT variables
- Configuration - views, nav.conf, lazysite.conf, themes
- Reference - front matter keys, variables, file locations
- Development - dev server, troubleshooting, build tools
- API mode - raw mode, JSON endpoints, query strings
MIT
lazysite was developed interactively with Claude (Anthropic). Architecture, design decisions, security review, and deployment were directed by the author. Claude assisted with code generation, documentation, and iterative refinement throughout development.