twostraws/Ignite
56.6
Adequate · 1 October 2026
24.3k
lines of production code
Swift
primary language
2
measurements over time
What this system is
Ignite is a Swift-based static site generator that allows developers to define website structures and content using a declarative, SwiftUI-style API. It compiles these definitions into static HTML, supporting features like responsive theming, interactive JavaScript actions, and multiple syndication feed formats. The system includes a dedicated CLI for project management and a robust publishing pipeline that handles asset bundling and site deployment.
How it got here
2024 — Swift 6 migration and framework overhaul
28 changes.
This period focused on upgrading the project to Swift 6.0 and introducing the Ignite CLI tool for site management. The core framework underwent a significant architectural rewrite, implementing type-safe HTML protocols, a SwiftUI-style environment system, and a comprehensive animation and styling engine. Additionally, the test suite was migrated from XCTest to Swift Testing to align with modern development practices.
2025–2026 — responsive styling and test expansion
20 changes.
This period focused on expanding the framework's responsive and interactive capabilities by introducing new layout types, CSS media query support, and JavaScript event modifiers. Concurrently, the team significantly broadened test coverage across core types, modifiers, publishing infrastructure, and analytics features to ensure robustness.
Features
Add QR code generation capability
Users can now generate QR codes from text strings within the IgniteCLI. This change introduces a new \QRCode\ struct that leverages Apple's CoreImage framework to create QR images, supporting configurable error correction levels (Low, Medium, Quantize, High). The generated codes are accessible as boolean matrices or rendered as ASCII art representations (both standard and compact half-block formats) directly in the terminal. The implementation is restricted to platforms where CoreImage is available.
Sources/IgniteCLI/QR Generation · high confidence
Add support for multiple analytics services
Users can now embed tracking code for Google Analytics 4, Plausible, Fathom, Clicky, TelemetryDeck, or custom scripts directly into the page head. The new \Analytics\ struct allows configuring specific services via identifiers (such as measurement IDs or site IDs) and, for Plausible, selecting specific measurement options like file downloads or outbound links.
Sources/Ignite/Framework/Analytics · high confidence
Added default file header template for Xcode
Developers using Xcode to edit this Swift Package will now see a standardized file header template (including filename, project name 'Ignite', and license reference) automatically inserted when creating new files, improving consistency in source code documentation.
.swiftpm · high confidence
Introduce Category protocol for grouping articles
A new \Category\ protocol has been added to the rendering layer, enabling articles to be grouped by criteria beyond simple tags. This change introduces specific implementations including \TagCategory\ for individual tags, \AllTagsCategory\ for aggregating all tagged articles, and \EmptyCategory\ as a placeholder, providing a foundational structure for organizing site content.
Sources/Ignite/Rendering/Category · high confidence
Introduce Ignite CLI for site management
The Ignite CLI tool is now available, providing commands to create new sites (\ignite new\), build HTML output (\ignite build\), and run a local development server (\ignite run\). The run command automatically detects subsites via canonical links, handles port conflicts, and displays a QR code for mobile previewing on supported platforms.
Sources/IgniteCLI · high confidence
Introduce responsive font sizing and granular font style controls
The font theming system now supports responsive typography, allowing developers to define different font sizes for various screen breakpoints (xSmall through xxLarge) using the new \Font.Responsive\ API. Additionally, the \Font.Style\ enum has been expanded with smaller text variants (small, xSmall, xxSmall, xxxSmall) to provide finer control over text hierarchy, and the underlying \Font\ struct now natively handles responsive size values alongside standard fixed sizes.
Sources/Ignite/Themes/Fonts · high confidence
Introduction of Ignite CLI tool and improved site preview workflow
The Ignite command-line tool is now available for creating, building, and previewing sites, replacing the previous recommendation to clone a starter template. Users can install the tool via \make install\ and use commands like \ignite new\, \ignite build\, and \ignite run --preview\ to manage their projects. The preview workflow has been updated to require the CLI tool to ensure assets load correctly, and the README now documents how to add layouts for rendering Markdown content.
(repo-wide) · high confidence
New CSS media query types for responsive and preference-based styling
Added new query types in the framework to apply styles based on viewport breakpoints (small through xxLarge and custom), user preferences (color scheme, contrast, motion, transparency), device state (orientation, display mode), and current theme. These enable developers to create responsive and accessible designs that adapt to user settings and device capabilities.
Sources/Ignite/Framework/Queries · high confidence
New JavaScript action modifiers for interactive page elements
The \Sources/Ignite/Actions\ module introduces a new \Action\ protocol and a suite of concrete action types that allow developers to attach JavaScript behaviors to page elements. This includes \ShowModal\ and \DismissModal\ for controlling Bootstrap modal dialogs, \ShowElement\, \HideElement\, and \ToggleElementVisibility\ for manipulating CSS visibility classes, \ShowAlert\ for browser alerts, \SwitchTheme\ for dynamic theme changes, and \CustomAction\ for injecting arbitrary JavaScript. The \EventType\ enum provides a comprehensive list of supported JavaScript events (such as click, keydown, and form events) to trigger these actions.
Sources/Ignite/Actions · high confidence
New JavaScript event modifiers for HTML elements
Users can now attach JavaScript event handlers to HTML and inline elements using new modifiers: \onClick\ and \onDoubleClick\ for click events, \onHover\ for mouse-over and mouse-out states, and a generic \onEvent\ method for attaching arbitrary event types with specific actions. These modifiers simplify adding interactivity to page elements by providing a consistent, type-safe API that returns the modified element with the appropriate event attributes applied.
Sources/Ignite/Actions/Event Modifiers · high confidence
New comprehensive animation system with keyframes and transitions
Ignite now includes a full animation framework allowing developers to create complex, multi-step keyframe animations and simple CSS transitions. Users can define animations triggered by click, hover, or element appearance using a declarative syntax via \KeyframeBuilder\. The system supports built-in effects like bounce and wiggle, as well as granular control over timing curves (including spring animations), direction, fill mode, and specific CSS properties such as color, transform, and opacity through the new \Animation\ and \Transition\ types.
Sources/Ignite/Framework/Animations · high confidence
New feed formats and improved asset copying
The publishing pipeline now supports generating Atom and JSON Feed v1.1 syndication feeds in addition to the existing RSS format, with configurable paths and content filtering. The asset copying process has been refactored to merge contents from the project's Assets and Fonts directories into the build output, preventing overwrites of existing Ignite-generated files like CSS and fonts. Additionally, the RSS feed generator now properly escapes XML special characters in titles and descriptions, and uses the site's configured time zone for publication dates.
Sources/Ignite/Publishing · high confidence
New form, layout, and media elements introduced
This release adds several new UI components to the framework. Forms are now supported with the \Form\, \TextField\, \ControlGroup\, and \SubscribeAction\ elements, allowing users to collect user input with customizable layouts and styling. Layout capabilities are expanded with \Grid\ (a 12-column responsive grid), \HStack\ (horizontal stacking), and \Label\ (icon and text side-by-side). Media support includes new \Audio\ and \Video\ elements for embedding content, while \Abbreviation\ provides semantic HTML for definitions. Additionally, \ArticlePreview\ offers a styled card component for displaying article summaries.
Sources/Ignite/Elements · high confidence
New layout, styling, and responsive type definitions in Ignite
This change introduces a comprehensive set of new types and refactors existing ones within the \Sources/Ignite/Types\ directory to support advanced layout and theming capabilities. New types include \Alignment\ for two-axis positioning, \AnchorPoint\ and \Angle\ for CSS transform origins, \Gradient\ for linear/radial/conic backgrounds, \ResponsiveValues\ for breakpoint-based cascading values, and \Percentage\ for unit-safe calculations. Existing types have been reorganized from \Styles\ to \Types\, updated with \Sendable\ conformance, and refined: \SpacingAmount\ now uses \xSmall\/\xLarge\ naming, list marker styles (\OrderedListMarkerStyle\, \UnorderedListMarkerStyle\) replace \default\ with \automatic\, and \ColumnWidth\ is introduced to control Bootstrap column sizing. These types provide the foundational data structures for the framework's responsive and styling engine.
Sources/Ignite/Types · high confidence
New string, date, and URL utility extensions with improved slug generation
This update adds several new extension methods to simplify common formatting and path tasks: \String\ now includes \convertingCSSNamesToJS()\, \escapedForJavascript()\, \escapedForXML()\, \kebabCased()\, \titleCase()\, and a \truncatedHash\ property for deterministic short identifiers; \Date\ gains an \asISO8601\ formatter and \asRFC822()\ now accepts an optional \TimeZone\ (defaulting to GMT) with a fixed POSIX locale for consistent output; \URL\ provides \selectDirectories(from:)\ and \makeDirectories(source:build:)\ to locate source/build folders (supporting app targets without Package.swift) and a \decodedPath\ property. Additionally, \String.convertedToSlug()\ is now public and guaranteed to return a string (falling back to kebab-case instead of returning nil), and \URL.init(\_:)\ is updated to use the static initializer for better performance.
Sources/Ignite/Extensions · high confidence
Architecture
Refactored CSS generation architecture with new animation and style managers
The CSS generation pipeline in the publishing engine has been restructured to improve maintainability and reduce duplication. A new \AnimationManager\ and \AnimationClassGenerator\ now centrally coordinate the registration and CSS output for hover, click, and appear-triggered animations (including keyframes and transitions). Responsive styling is handled by a dedicated \CSSManager\ that queues and generates media-query rules for breakpoints, font sizes, and display states. The \StyleManager\ has been rewritten to analyze \Style\ implementations against \EnvironmentConditions\ (such as color scheme, motion, and orientation) to produce minimal, unique CSS rulesets. Supporting types like \EnvironmentConditions\, \Ruleset\, \MediaQuery\, and \CSSBuilder\ provide a structured, type-safe foundation for these changes.
Sources/Ignite/Publishing/CSS · high confidence
Behavioural changes
Attribute modifiers now persist on custom elements via HTMLModifier protocol
Attribute modifiers (ARIA, classes, styles, IDs, data, and custom attributes) are now implemented using the HTMLModifier protocol, ensuring that these attributes are correctly applied to custom HTML elements rather than being ignored. This change fixes a bug where user-defined elements did not respect attribute modifiers and simplifies the underlying implementation by removing the need for ModifiedHTML and HTMLModifier protocols in the modifier logic itself.
Sources/Ignite/Modifiers/Attribute Modifiers · high confidence
CSS assets reorganized with new global rules, Material support, and Prism syntax highlighting
The CSS resources have been restructured to improve theming and code display. A new \global-rules.css\ file centralizes base styles for typography, links, alerts, and background utilities. Support for SwiftUI-style \Material\ backgrounds has been added via \ignite-core.min.css\, providing translucent, blurred backgrounds that adapt to light and dark themes. Syntax highlighting has been standardized on PrismJS 1.29.0, with new theme files for GitHub, Solarized, and Xcode (light/dark) that respect theme-specific monospace fonts and code block sizes. Additionally, Bootstrap Icons have been updated to v1.13.1.
Sources/Ignite/Resources/css · high confidence
FeedLink now supports multiple syndication formats and configurable paths
The FeedLink component has been updated to render links for all configured feed formats (such as RSS, Atom, and JSON Feed) rather than just a single RSS feed. It now reads feed paths from a new \feedConfiguration\ environment value, allowing users to customize the endpoint URLs for each format, and falls back to default paths if none are specified. Additionally, the IgniteFooter component has been updated to display "Created in Swift with Ignite" and uses a static URL initializer for the GitHub link.
Sources/Ignite/Components · high confidence
Framework restructured with new type-safe HTML and accessibility APIs
The framework has been refactored to use a new SwiftUI-style HTML protocol, introducing type-safe wrappers like AnyHTML and AnyInlineElement to handle content without excessive type erasure. Accessibility is improved with a dedicated AriaType enum and structured CoreAttributes that manage ARIA, CSS, and data attributes in insertion order. Content handling is renamed from Content to Article, and the system now supports custom error pages via the ErrorPage protocol, JavaScript events through the Event struct, and resource decoding via DecodeAction, providing a more robust and type-safe foundation for site generation.
Sources/Ignite/Framework · high confidence
Ignite framework bundle and version exposed as global constants
The Ignite framework now exposes its bundle location and current version as global constants (\bundle\ and \version\) rather than static properties on a struct. This allows direct access to the bundle for resource loading and the version string (updated to v0.6.9) for generator information without needing to reference the \Ignite\ type. This change simplifies access to these core framework values.
Sources/Ignite · high confidence
Improved theme switching and new client-side utilities
The JavaScript resources now include a dedicated theme-switching script that handles automatic system color scheme changes and prevents visual flicker by separating the user's theme selection state from Bootstrap's explicit theme attribute. The core library adds support for email protection (obfuscating links to prevent scraping), client-side table filtering with row backup for zebra striping, and appear animations for elements. These changes enhance the user experience by providing more robust theming, better security for contact links, and interactive table features without requiring server-side processing.
Sources/Ignite/Resources/js · high confidence
Introduce SwiftUI-style environment system for site context
The framework now provides a centralized \EnvironmentValues\ store and \@Environment\ property wrapper, allowing views to access global site configuration (such as themes, metadata, and feed settings) and dynamic rendering context (such as the current page, article, or category) directly from the view hierarchy. This replaces previous mechanisms for passing site and page state, enabling a more consistent, SwiftUI-like approach to accessing contextual data throughout the site generation process.
Sources/Ignite/Framework/Environment · high confidence
Introduce structured HTTP error handling protocol
The framework now defines a dedicated \HTTPError\ protocol to standardize how server-side errors are represented and displayed. This change introduces a \PageNotFoundError\ struct for 404 responses and provides a static \pageNotFound\ convenience property, while replacing the previous generic \BaseElement\ concept with an \EmptyHTTPError\ type to specifically handle the absence of error data. Users can now rely on a consistent interface for error status codes, titles, and descriptions within the rendering layer.
Sources/Ignite/Rendering/ResponseErrors · high confidence
Markdown rendering improvements and site-wide customization support
Users can now customize how Markdown is rendered by implementing the new ArticleRenderer protocol, allowing site-wide overrides of the default parsing behavior. The Markdown-to-HTML conversion has been refined to correctly handle line breaks: soft breaks (single newlines) now render as spaces, and hard line breaks (preceded by two spaces) render as \<br /\> tags. Additionally, generated HTML tables now include a 'table' CSS class for easier styling, and table header cells (\<th\>) include a scope attribute for better accessibility. The previous YAML front-matter parsing logic has been removed from the core renderer, decoupling metadata handling from content rendering.
Sources/Ignite/Rendering/Markdown · high confidence
Refactor page metadata handling and introduce TabFocus support
The rendering layer now separates site-level metadata into a new \SiteMetadata\ struct and renames the existing \Page\ struct to \PageMetadata\ (removing the \body\ property from this metadata-only type) to better reflect its role in storing page title, description, URL, and image. Additionally, a new \TabFocus\ enum is introduced to provide type-safe control over the HTML \tabindex\ attribute, replacing the previous generic \AttributeValue\ approach for this specific use case.
Sources/Ignite/Rendering · high confidence
Refactored HTML element type hierarchy and protocols
The framework's element type system has been restructured to improve type safety and consistency. The previous \PageElement\ and \BlockElement\ protocols have been removed and replaced with a new hierarchy where \MarkupElement\ is the base, \BodyElement\ represents elements within the \\<body\>\, and \InlineElement\ handles inline content. The \Document\ type is now a protocol rather than a concrete implementation, and \PassthroughHTML\ has been renamed to \PassthroughElement\. Additionally, \ListableElement\ has been moved from \Theme.swift\ to this module and simplified to focus on list rendering, while \HeadElement\ now conforms directly to \MarkupElement\. These changes standardize how attributes, modifiers, and markup generation are handled across all HTML elements.
Sources/Ignite/Framework/ElementTypes · high confidence
Refactored result builders and element type safety
The framework's result builders have been reorganized into a dedicated \ResultBuilders\ directory, introducing specialized builders for documents (\DocumentBuilder\, \DocumentElementBuilder\), general HTML (\HTMLBuilder\), and inline elements (\InlineElementBuilder\). This change replaces the previous generic \ElementBuilder\ with more specific type constraints, such as using \any HeadElement\ instead of \HeadElement\ and introducing \ErrorPage\ and \ArticlePage\ builders. Additionally, the generic builder now uses \flatMap(\\.self)\ for cleaner array flattening, and inline element handling has been updated to use \InlineElementCollection\ and \AnyInlineElement\ for better type safety and performance.
Sources/Ignite/Rendering/ResultBuilders · high confidence
Refactored styling system with new Style protocol and StyledHTML type
The styling architecture in Sources/Ignite/Styles has been restructured to support environment-aware visual treatments. A new \Style\ protocol allows reusable styles to adapt based on media queries and theme settings, while \StyledHTML\ serves as the concrete type for resolving these styles. This change replaces the previous \CoreAttributes\ struct and removes legacy types like \ColumnWidth\ and \Font\, streamlining how CSS classes, inline styles, and attributes are managed and applied to HTML elements.
Sources/Ignite/Styles · high confidence
Rewritten Theme system with Bootstrap 5 variable mapping and responsive typography
The theme engine in Sources/Ignite/Themes has been completely rewritten to align with Bootstrap 5's CSS variable architecture. The new \Theme\ protocol exposes granular control over colors (including emphasis, secondary, and tertiary variants), typography (with separate font families and weights for headings and body), and spacing. A key behavioral change is the introduction of \ResponsiveValues\ for font sizes, site width, and breakpoints, allowing users to define responsive typography that adapts across screen sizes. The system now includes built-in \DefaultLightTheme\, \DefaultDarkTheme\, and a new \AutoTheme\ that switches based on system preferences, all deriving their CSS IDs and names intelligently from their type names.
Sources/Ignite/Themes · high confidence
Rewritten modifier system with new styling capabilities
The modifier system in Sources/Ignite/Modifiers has been completely rewritten and expanded. The old BackgroundColor modifier is removed and replaced by a unified background() modifier that supports colors, materials, and gradients. New modifiers include animation and transition support for keyframe and CSS transitions, hover effects, badges for list items, and precise background image control with positioning and sizing modes. Typography is enhanced with dedicated font, font weight, font style, letter spacing, line spacing, and small caps modifiers. Layout and visibility are improved with container-relative frames, fixed sizing, clipping, and responsive hidden states. Additional features include custom cursor styles, text decorations, privacy-sensitive link encoding, and ignore-page-gutters for full-width elements. The refactoring also moves related utilities like EdgeAdjust into the modifiers folder and introduces a Style protocol for custom style registration.
Sources/Ignite/Modifiers · high confidence
Robots framework types conform to Sendable
The core types in the Robots framework—DisallowRule, KnownRobot, and RobotsConfiguration—now conform to the Sendable protocol, enabling them to be used safely in concurrent contexts. Additionally, KnownRobot now conforms to CaseIterable, allowing iteration over all known robot types.
Sources/Ignite/Framework/Robots · high confidence
Test coverage
Added Swift Testing infrastructure for Ignite; Added comprehensive test coverage for framework extensions; Added test coverage for Actions and EventModifiers; Added test coverage for publishing infrastructure and feed generators; Added test fixtures for error pages and site publishing; Added test suite for subsite publishing behavior; Added tests for default theme colors and theme identity properties; Added tests for relative path generation in site publishing; Added unit tests for Robots framework components; Added unit tests for UI modifiers; Added unit tests for core layout and styling types; Added unit tests for the Ignite framework core; Expanded test coverage for Ignite UI elements; Migrated Element tests from XCTest to Swift Testing; Removed XCTest base class in favor of Swift Testing.
Dependencies
Swift 6.0 upgrade and new IgniteCLI tool with updated dependencies
The package now requires Swift 6.0 and introduces a new command-line tool, IgniteCLI, built using Swift Argument Parser. Several dependencies have been updated or added: swift-markdown has moved to the swiftlang organization and is pinned to version 0.6.0, while swift-collections (1.1.4) and SwiftSoup (2.7.5) are newly integrated. The legacy Package.resolved lockfile has been removed.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 67 → 57 (-10.0)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.
Lenses
- Code Health 97 → 97 (-0.4)
- Architecture 95 → 92 (-3.2)
- Maturity 55 → 55 (-0.0)
- Readiness 55 → 37 (-18.4)
- Security 100 → 100 (+0.0)
Resolved (4)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Members sharing a duplicated core (4 members, 50+ identical tokens) (Sources/Ignite/Framework/Environment/EnvironmentValues.swift)
- Off-boarding risk: anonymized user #1
New (18)
- Action types for modals are split by operation (Show vs Dismiss) rather than being a single ModalAction type. While distinct, this pattern is inconsistent with how other UI components (like Button or Link) are structured as declarative types. If ShowModal and DismissModal are meant to be used in a similar context (e.g., a list of actions), the naming convention Show* vs Dismiss* is acceptable, but HideElement vs ShowElement vs ToggleElementVisibility (see above) suggests a broader inconsistency in how state changes are modeled.
- Coverage not measured — Swift suite
- Dependency hygiene PARTLY measured — SwiftPM pinning read, dependency currency NOT established
- Duplicated block (11–12 lines × 2) (Sources/Ignite/Modifiers/FontModifier.swift)
- Duplicated block (12 lines × 2) (Sources/Ignite/Framework/Animations/Animation.swift)
- Duplicated block (12–13 lines × 2) (Sources/Ignite/Modifiers/Frame.swift)
- Duplicated block (15 lines × 2) (Sources/Ignite/Framework/Animations/Animation.swift)
- Duplicated block (6–7 lines × 4) (Sources/Ignite/Modifiers/FontModifier.swift)
- Duplicated block (7 lines × 2) (Sources/Ignite/Framework/ElementTypes/HTML.swift)
- Duplicated block (7 lines × 2) (Sources/Ignite/Framework/HTMLCollection.swift)
- Duplicated block (7 lines × 2) (Sources/Ignite/Modifiers/Opacity.swift)
- Duplicated block (9 lines × 4) (Sources/Ignite/Modifiers/Margin.swift)
- FontModifier.swift.fontModifier (cognitive 23) (Sources/Ignite/Modifiers/FontModifier.swift)
- Members sharing a duplicated core (4 members, 50+ identical tokens) (Sources/Ignite/Framework/Environment/EnvironmentValues.swift)
- Members sharing a duplicated core (4 members, 50+ identical tokens) (Sources/Ignite/Modifiers/Margin.swift)
- Off-boarding risk: anonymized user #1
- Projects may be oversized for their cohesion
- UI state manipulation actions are fragmented into three distinct types. HideElement and ShowElement are inverse operations that likely share the same underlying implementation (toggling a CSS class or style), while ToggleElementVisibility performs a state flip. This forces the user to choose between explicit intent (Show/Hide) and state flipping (Toggle), creating redundancy.
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
twostraws/Ignite was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit ebc296e9f8e30caa16cd42fb27b7c18e840565ce — the exact code this score is about.
- Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.