Revision history for App-Dapper

1.00    2026-10-29
        Dapper 1.0 makes page content safe by default, adds what a modern
        static site needs (schemas, data files, pagination, feeds,
        sitemaps, SEO tags), and makes sites easy for AI tools to read and
        for AI assistants to work on. It adds starter themes and makes
        publishing one command. See "Upgrading to 1.0" in the README.

        Changed: page content is no longer run as template code unless the
        page sets template: true. Layouts always are. Set
        templates_in_content: true in _config.yml for the old behavior,
        where content and _config.yml values were templates too.

        Added: front matter schemas. A _schema.yml in a source directory
        lists required fields and types, allowed values, patterns and
        limits, and every problem on every page is reported at once.

        Added: data files. YAML and JSON files in _data are available as
        site.data.

        Added: tags (site.tags), pagination (paginate in front matter, with
        a paginator), and generated category and tag pages
        (category_pages and tag_pages in _config.yml).

        Added: a sitemap (/sitemap.xml), an Atom feed (feed in
        _config.yml), and page.seo with a description, canonical link,
        Open Graph and Twitter tags and JSON-LD structured data.

        Added: a Markdown copy of each Markdown page next to its HTML, and
        /llms.txt and /llms-full.txt listing them, for AI tools.

        Added: dapper check, which finds broken links, front matter and
        schema problems, missing layouts, template errors and pages
        written to the same file, without touching the output directory.
        --json prints the report for scripts and AI assistants.

        Added: dapper mcp, a Model Context Protocol server that lets AI
        assistants list, read, write (checked against schemas), check and
        build pages.

        Added: dapper init --template blog, a complete starter blog.

        Added: fenced code blocks (```perl ... ```) with language-* classes
        for client-side highlighting, which Text::MultiMarkdown did not
        support, and search with Pagefind (search: true).

        Added: builds remove files left over from earlier builds (only
        files Dapper wrote; clean: false turns it off), and dapper serve
        reloads pages in the browser after each rebuild.

        Added: -C/--directory to run in another directory.

        Added: new ways to install: a single file that runs with any Perl
        5.10+ (attached to each GitHub release), a Docker image
        (ghcr.io/markdbenson/dapper) and a Homebrew formula.

        Added: AGENTS.md. dapper init writes a guide to the project for AI
        coding agents, generated from the project (commands, folders,
        layouts, the rules in every schema, categories and tags in use),
        and a CLAUDE.md that points Claude Code at it. dapper agents
        updates it, keeping notes outside its markers. Layouts can
        describe themselves with a description in their front matter.

        Added: MCP prompts (new_site, write_post, audit_site), resources
        (dapper://guide, dapper://config, dapper://schemas), and tools:
        rename_page (adds a redirect from the old URL), read_layout and
        write_layout (a layout is parsed before it is saved).

        Added: redirects, from redirects in _config.yml or
        _data/redirects.yml, written as small pages at the old URLs.

        Added: three themes alongside blog: portfolio, business (services,
        hours and contact details from one data file, with LocalBusiness
        structured data) and docs (a sidebar from a data file, with
        previous and next links). dapper init --template also takes a
        directory or a git URL, and dapper templates lists the built-ins.

        Added: dapper deploy, which builds, checks and publishes the site
        to Amazon S3 (with the AWS CLI, and an optional CloudFront
        invalidation), GitHub Pages (keeping the branch's history), or a
        command of your own. It refuses to deploy a site with errors unless
        --force is given; --dry-run shows what would happen.

        Added: ROADMAP.md.

        Fixed: files with accented letters in their names were skipped or
        copied to the wrong name.

        Fixed: two pages writing the same output file is now an error.

0.22    2026-10-29
        Fixed: settings in _config.yml (source, output, layout) are now
        honoured by every command. Command line options override the
        config file, which overrides the defaults. (GitHub #8)

        Fixed: pages with their own urlpattern are written to the path
        their URL describes, not the source file name. URLs ending in /
        become index files using the page extension. Empty tokens such as
        :category are dropped, and :slug falls back to the file name when a
        page has no title. page.url is now correct for plain pages too.
        (GitHub #5)

        Documented every site.* and page.* variable. Replaced the old
        Liquid syntax in the POD with the template syntax Dapper uses.
        (GitHub #4)

        Moved continuous integration from Travis CI to GitHub Actions,
        testing Perl 5.10 to 5.40 on Linux and macOS. (GitHub #11)

        Fixed: files are copied by Dapper itself instead of the shell, so
        names with spaces or shell characters work and cannot run commands.
        The output, source and layout directories are never copied into
        the output.

        Fixed: files in the source directory without front matter (images,
        zip files, plain text) are copied as they are instead of crashing
        the build.

        Fixed: front matter must start on the first line and close on a
        line of its own, so "---" inside a value no longer breaks a page.
        Empty front matter is allowed. Parse errors name the file.

        Fixed: dates in the pre-0.19 "2014-05-02 10:30:00" format and plain
        dates are accepted again, and a bad date names the file.
        Dates written without a time zone are now in the page's timezone
        setting, the new site-wide timezone setting, or the local time zone
        (xmlschema used to label them UTC).

        Fixed: layouts can be nested any number of levels, loops are
        reported, and front matter is removed from top-level layouts.

        Fixed: categories may be a list, and pages are processed in sorted
        path order so site.pages and page.id are the same on every machine.
        (page.id values may differ from 0.21, which used directory order.)

        Fixed: the replace_last filter now receives its arguments and
        matches literally, and smart handles adjacent dashes. The built-in
        json method ([% page.json(1) %], [% x | json %]) no longer
        double-encodes non-ASCII text. Removed Dapper's own json filter,
        which the built-in json always took precedence over. Dates gained
        an xmlschema method ([% page.date.xmlschema %]) because filters do
        not apply to dates.

        Fixed: watch now notices the config file and added or removed
        files, and keeps running when a rebuild fails.

        Fixed: unknown commands and options exit with an error, and failed
        builds exit non-zero. Added -q/--quiet, --help and --version.

        Removed dependencies on CGI, Data::Dumper::HTML, File::Monitor,
        Getopt::Mixed, Template::Toolkit (Template::Constants), Text::Markdown
        and Test. Removed the unused App::Dapper::Serve module. The minimum
        Perl version is now 5.10.

        Replaced the placeholder tests with a real test suite.

        Documentation: added a table of contents, a step-by-step blog
        tutorial, sections on source file types, assets, drafts and clean
        builds, limitations, upgrading from 0.21, troubleshooting and
        contributing, and refreshed the deployment instructions.

0.21    2025-01-22
        Added CGI to list of module dependencies.

0.20    2025-01-21
        Removed dependency on YAML::Tiny from test framework

0.19    2025-01-20
        Changed to Net::HTTPServer for local webserver use. This is a much
        better forking webserver to use than HTML::Brick and better supported.

        Enabled EVAL_PERL for embedding perl code in templates. Set EVAL_PERL
        to "true" to use (e.g. export EVAL_PERL=true). Then use [% perl %] blocks
        in templates to use embedded perl in your templates. See README for more.

        Changed timestamp format to use the ISO 8601 style date/time format.
        In previous versions of Dapper, the date format for posts that was accepted
        was (\d\d\d\d)-(\d\d)-(\d\d) (\d\d)\:(\d\d)\:(\d\d).

        Updated YAML processor from YAML::Tiny to YAML::PP. Now, Dapper supports
        YAML 1.2. See the documentation for the YAML spec and/or the YAML::PP
        documentation for more information on exactly what features are supported.

0.18    2014-05-02
        Adopted the TT3 mini-language as provided by Template::Alloy
        Added urlpattern and extension variables to site and page definitions
        Added consistent handling of urlpattern, and output file extensions

0.17    2014-04-15
        Clarified JSON Perl module dependency in Makefile.PL

0.16    2014-04-15
        Added README content for config files, source files, and layouts.
        Added 'json' filter for dumping Liquid variables to JSON for debug.

0.15    2014-04-07
        Added command-line option to specify web server port number.
        Dapper now works with Perl installations as old as v5.8.

0.14    2014-04-02
        Added deploy instructions to README and a getting started guide.
        Changed MIN_PERL_VERSION from v-string to string to eliminate NetBSD errors.

0.13    2014-04-27
        Added explicit hash derefs in attempt to support Perl 5.19.{8-10}.

0.12    2014-04-26
        Added explicit hash deref to avoid experimental warning in Perl 5.19.

0.11    2014-04-26
        Added auto-reload of files while serving local webserver.
        Changed format of post IDs from their URL to a global incrementing integer.

0.10    2014-03-05
        Improved README narrative.
        Watch routine now watches everything except contents of the _output dir.

0.09    2014-02-20
        Added 5.14.0 minimum perl version requirement.

0.08    2014-02-20
        Eliminated some tests (init, build) that were causing CI failures.

0.07    2014-02-20
        Added Getopt::Mixed to list of build options.

0.06    2014-02-20
        Added DateTime::Format::XSD dependency to resolve test errors.

0.05    2014-02-19
        Updated Makefile.PL dependencies to resolve errors for cpantesters.org.

0.04    2014-02-18
        Removed unicode characters from App::Dapper pod.
        Added references to source and issue tracking on github.

0.03    2014-02-18
        Added significant documentation to App::Dapper and bin/dapper.
        Simplified default _config.yml file.

0.02    2014-02-17
        Added documentation link from App::Dapper to bin/dapper.
        Fixed FreeBSD testing error as reported by cpantesters.org.

0.01    2014-02-01
        First version.

