Scaffold a new Rails app with event sourcing, following project conventions (todomvc as reference)

MITAuto-check passedBackend & APIs

Install New App

skills CLI
$ npx skills add RailsEventStore/ecommerce --skill new-app -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install RailsEventStore/ecommerce new-app --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/RailsEventStore/ecommerce.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/new-app .claude/skills/new-app && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
new-app
GitHub stars
507
Token cost
~3.1k tokens
SKILL.md length
1,045 words
Files
1
Skills in repo
8
Repo updated
First seen
Licence
MIT

At a glance

Scaffold a new Rails app with event sourcing, following project conventions (todomvc as reference)

  • Works in 11 steps: Gather requirements → Generate the Rails app → Configure Gemfile → …
  • Tasks that involve Event-driven systems
  • SKILL.md covers When to use, Reference, Version policy (do this first,… and Commit cadence, plus 5 more sections
  • Calls rails, bundle and gem

What it does

New App is an agent skill from RailsEventStore/ecommerce. Scaffold a new Rails app with event sourcing, following project conventions (todomvc as reference)

Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Backend & APIs, covering Event-driven systems. It works with Ruby on Rails and Ruby. The repository describes itself as: Application with CQRS and Event Sourcing built on Rails and Rails Event Store. The licence is MIT.

When your agent uses it

  • Tasks that involve Event-driven systems

Example prompts

  • “/new-app”

Workflow steps

11 steps, taken from the step headings in SKILL.md.

  1. Gather requirements
  2. Generate the Rails app
  3. Configure Gemfile
  4. Create event store initializer
  5. Create app-level Configuration
  6. Create event store migration
  7. Create ApplicationController
  8. Create test helper
  9. Create .mutant.yml
  10. Register in root Makefile
  11. Create app Makefile

What it can do on your machine

Read from SKILL.md and the folder at commit 42c6c23. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • rails
    • bundle
    • gem
    • make

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

New App loads about 3.1k tokens when it runs. Until then it costs about 27 tokens; SKILL.md has 1,045 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~27
When it runs · the whole SKILL.md, loaded when a task matches
~3.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from RailsEventStore/ecommerce at commit 42c6c23, republished under its MIT licence (© RailsEventStore). 1,045 words, ~3,055 tokens.

Download SKILL.mdSave it as .claude/skills/new-app/SKILL.md (or your agent's skills folder).
name
new-app
description
Scaffold a new Rails app with event sourcing, following project conventions (todomvc as reference)

New App Scaffold

When to use

Use this skill when asked to create a new Rails application in the apps/ directory. Each app is a standalone Rails application that uses domain modules from domains/ and the shared infra gem.

Reference

apps/todo_mvc is the canonical reference for app structure (initializer, Configuration, test harness, Makefile). For the current RES 3.0 wiring and gem versions, use apps/rails_application and apps/twitter — todo_mvc still pins RES 2.x, which is stale. When the two disagree, follow rails_application.

Version policy (do this first, every time)

Always scaffold on the newest Ruby and newest Rails — do not hardcode versions from this doc, they go stale.

  • Newest Rails: gem list rails --remote --exact | head -1 (checks RubyGems, not just what's installed locally). As of this writing: Rails 8.1.3.
  • Newest Ruby: pick the highest installed under ~/.rbenv/versions/ (ls ~/.rbenv/versions | sort -V | tail). As of this writing: Ruby 4.0.1. Set it in the app's .ruby-version. Ruby 4.0.1 works with Rails 8.1 + RES 3.0 + the infra/domain gems.
  • Confirm the chosen Ruby's gemset actually has the target Rails: ~/.rbenv/versions/{ruby}/bin/rails -v.

Invoke rails/bundle via the full rbenv path for the chosen Ruby, e.g. ~/.rbenv/versions/4.0.1/bin/rails, ~/.rbenv/versions/4.0.1/bin/bundle — the rails shell alias may resolve to a different Ruby.

Commit cadence

Commit frequently at natural checkpoints, not once at the end. Commit directly on the current branch — do not create a feature branch. Suggested commits: (1) after generating the app + configuring the Gemfile, (2) after RES wiring is green, (3) after each domain/read model. Per project convention, use the /commit skill and never mention Claude in commit messages.

Step-by-step process

1. Gather requirements

Before writing any code, clarify:

  • The app name (snake_case, e.g. crm, inventory_tracker)
  • Which domain modules it will use (existing ones from domains/ or new ones to be created)
  • What the app does at a high level — what entities, what user actions
2. Generate the Rails app

Run from the apps/ directory, using the full rbenv path for the newest Ruby (see Version policy above):

bash
cd apps && ~/.rbenv/versions/{ruby}/bin/rails new {app_name} --database=postgresql --css=tailwind --skip-test

--skip-test (not --skip-test-unit, which no longer exists) drops the default test setup so we can install our own minitest + mutant harness.

Important post-generation steps:

  • Set the app's Ruby: echo "{ruby}" > apps/{app_name}/.ruby-version (the generator pins the global default, which may not be the newest).
  • rails new creates a nested .git directory inside the new app. It must be removed so the app is part of the parent repo. rm -rf is blocked by the repo's git-safety hook, so ask the user to run it manually: rm -rf apps/{app_name}/.git. Do not proceed to committing until it's gone.
3. Configure Gemfile

Add these gems to the generated Gemfile (after jbuilder, before the tzinfo/solid gems). Use RES 3.0 to match rails_application:

ruby
gem "rails_event_store", ">= 3.0", "< 4.0"
gem "arkency-command_bus"
gem "infra", path: "../../infra"

Rails 8.1 with --skip-test does not generate a capybara/selenium test group. Just add a test group:

ruby
group :test do
  gem "mutant-minitest"
end

Run bundle install (via the full rbenv path). Commit the generated app + Gemfile now (checkpoint 1).

4. Create event store initializer

Create config/initializers/rails_event_store.rb:

ruby
require "rails_event_store"
require "arkency/command_bus"

require_relative "../../lib/configuration"

Rails.configuration.to_prepare do
  Rails.configuration.event_store = Infra::EventStore.main
  Rails.configuration.command_bus = Arkency::CommandBus.new

  Configuration.new.call(Rails.configuration.event_store, Rails.configuration.command_bus)
end
5. Create app-level Configuration

Create lib/configuration.rb. For the initial scaffold there is no domain yet, so call only wires event linking — this keeps the app bootable and tests green before any domain exists:

ruby
require_relative "../../../infra/lib/infra"

class Configuration
  def call(event_store, command_bus)
    enable_res_infra_event_linking(event_store)
  end

  private

  def enable_res_infra_event_linking(event_store)
    [
      RailsEventStore::LinkByEventType.new,
      RailsEventStore::LinkByCorrelationId.new,
      RailsEventStore::LinkByCausationId.new
    ].each { |h| event_store.subscribe_to_all_events(h) }
  end
end

As domains and read models are added later, extend call: require_relative the domain, add {DomainModule}::Configuration.new.call(event_store, command_bus), and give each read model its own enable_* private method called from call. Do not add a require_relative to a domain that doesn't exist yet — it will break boot.

6. Create event store migration

In RES 3.0 the generator was renamed — the old rails_event_store_active_record:migration no longer exists. Use the ruby_event_store namespace with a data type (jsonb pairs cleanly with infra's RailsEventStore::JSONClient):

bash
cd apps/{app_name} && ~/.rbenv/versions/{ruby}/bin/bundle exec rails generate ruby_event_store:active_record:migration --data-type=jsonb

Then rails db:create && rails db:migrate (via the full rbenv path). The generated migration creates event_store_events and event_store_events_in_streams with uuid event_id and jsonb data/metadata.

7. Create ApplicationController

Ensure app/controllers/application_controller.rb has:

ruby
class ApplicationController < ActionController::Base
  allow_browser versions: :modern

  def command_bus
    Rails.configuration.command_bus
  end

  def event_store
    Rails.configuration.event_store
  end
end
Show full SKILL.md (422 more words)Show less
8. Create test helper

Replace the generated test/test_helper.rb (which has parallelize and fixtures :all):

ruby
ENV["RAILS_ENV"] ||= "test"
require_relative "../config/environment"
require "rails/test_help"
require "mutant/minitest/coverage"

ActiveJob::Base.logger = Logger.new(nil)

class InMemoryRESTestCase < ActiveSupport::TestCase
  def before_setup
    result = super
    @previous_event_store = Rails.configuration.event_store
    @previous_command_bus = Rails.configuration.command_bus
    Rails.configuration.event_store = Infra::EventStore.in_memory
    Rails.configuration.command_bus = Arkency::CommandBus.new

    Configuration.new.call(
      Rails.configuration.event_store, Rails.configuration.command_bus
    )
    result
  end

  def before_teardown
    result = super
    Rails.configuration.event_store = @previous_event_store
    Rails.configuration.command_bus = @previous_command_bus
    result
  end

  def event_store
    Rails.configuration.event_store
  end

  def command_bus
    Rails.configuration.command_bus
  end
end

class InMemoryRESIntegrationTestCase < ActionDispatch::IntegrationTest
  def before_setup
    result = super
    @previous_event_store = Rails.configuration.event_store
    @previous_command_bus = Rails.configuration.command_bus
    Rails.configuration.event_store = Infra::EventStore.in_memory_rails
    Rails.configuration.command_bus = Arkency::CommandBus.new

    Configuration.new.call(Rails.configuration.event_store, Rails.configuration.command_bus)
    result
  end

  def before_teardown
    result = super
    Rails.configuration.event_store = @previous_event_store
    Rails.configuration.command_bus = @previous_command_bus
    result
  end

  def command_bus
    Rails.configuration.command_bus
  end
end
9. Create .mutant.yml

Create .mutant.yml in the app root. On the initial scaffold there are no subjects yet, so start with empty lists (mutant isn't run until there's domain code to cover):

yaml
includes:
  - test
requires:
  - ./config/environment
integration: minitest
usage: opensource
coverage_criteria:
  timeout: true
  process_abort: true
matcher:
  subjects: []
  ignore: []

As each read model is added, append its namespace to subjects (e.g. - Tweets*) and its AR model + Configuration#call to ignore. See apps/crm/.mutant.yml for a fully-populated example.

Mutant writes per-run result JSONs to .mutant/results/. These are transient artifacts and must never be committed — add this line to the app's .gitignore now:

/.mutant/results/
10. Register in root Makefile

Add targets to the root Makefile:

makefile
install-{app_name}:
	@make -C apps/{app_name} install

test-{app_name}:
	@make -C apps/{app_name} test

mutate-{app_name}:
	@make -C apps/{app_name} mutate

Add install-{app_name} to the install: target, test-{app_name} to test:, and mutate-{app_name} to mutate:.

11. Create app Makefile

Create Makefile in the app directory:

makefile
install:
	@bin/setup

dev:
	@make -j 2 web css

test:
	@bin/rails test

mutate:
	@RAILS_ENV=test bundle exec mutant run

tailwind:
	@bin/rails tailwindcss:build

css:
	@bin/rails tailwindcss:watch

web:
	@bin/rails server -p {port}

.PHONY: install dev test mutate tailwind css web

Use a unique port per app (3000 for rails_application, 3001+ for new apps).

Controller pattern

Controllers dispatch commands and query read models:

ruby
class ResourceController < ApplicationController
  def index
    @records = ReadModelName.all
  end

  def create
    id = SecureRandom.uuid
    ActiveRecord::Base.transaction do
      command_bus.call(DomainModule::CreateCommand.new(id: id, ...))
    end
    redirect_to root_path
  end

  def update
    command_bus.call(DomainModule::UpdateCommand.new(id: params[:id], ...))
    redirect_to root_path
  end

  def destroy
    command_bus.call(DomainModule::DeleteCommand.new(id: params[:id]))
    redirect_to root_path
  end
end

Build order

Build the app incrementally, with tests passing at each step:

  1. Scaffold Rails app + boilerplate (steps 2-11)
  2. Create or reference domain modules (use the /domain skill)
  3. Add read models one at a time (use the /read-model skill)
  4. Add controllers + views for each read model
  5. Add integration tests
  6. Run make test and mutation testing

Gotchas

  • Versions go stale: Do not hardcode Ruby/Rails versions — resolve the newest each time (see Version policy). This doc's concrete numbers (Ruby 4.0.1, Rails 8.1.3) are examples, not pins.
  • rails/bundle alias: The shell alias may resolve to the wrong Ruby. Always use the full rbenv path: ~/.rbenv/versions/{ruby}/bin/rails, ~/.rbenv/versions/{ruby}/bin/bundle.
  • Nested .git: rails new creates its own git repo. It must be removed before the app can be committed to the parent repo. rm -rf is blocked by the git-safety hook — ask the user to run rm -rf apps/{app_name}/.git manually.
  • .ruby-version: The generator pins the rbenv global default, not necessarily the newest — overwrite it with the chosen Ruby.
  • RES 3.0 migration generator renamed: use ruby_event_store:active_record:migration, not the old rails_event_store_active_record:migration (see step 6).
  • bin/rails commands (migrations, generators, tests): Must run from apps/{app_name}/ directory, not project root.
  • Generated boilerplate: Rails generates channels, kamal/solid config etc. These are harmless but unused — leave them or ask user to clean up.

Key conventions

  • Each app is a standalone Rails app in apps/
  • Apps reference domains via require_relative "../../../domains/{name}/lib/{name}"
  • Apps reference infra via gem "infra", path: "../../infra"
  • Read models live in app/read_models/{name}/configuration.rb
  • All event access uses event.data.fetch(:key)
  • Controllers use command_bus.call(...) for writes, read models for queries
  • UUIDs for all business entity IDs (SecureRandom.uuid)
  • Test-first TDD, 100% mutation score

© RailsEventStore, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/new-app of RailsEventStore/ecommerce.

Open the folder on GitHubat commit 42c6c23

Compare with similar skills

New App next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

New App compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
New App this skillRailsEventStore/ecommerce507—~3.1kAutomated safety check: PassMIT
Antipattern Preventiondoorkeeper-gem/doorkeeper5.5k—~1.1kAutomated safety check: PassMIT
Dependency Safetydoorkeeper-gem/doorkeeper5.5k—~931Automated safety check: PassMIT
Rails ExpertJeffallan/claude-skills12k—~1.4kAutomated safety check: PassMIT
Rails Patternsaffaan-m/ECC276k—~4.1kAutomated safety check: PassMIT
Ruby Patternssoftspark/ai-toolkit179—~2.3kAutomated safety check: PassApache-2.0

Similar skills

  • Antipattern Prevention

    doorkeeper-gem/doorkeeper

    Avoid common Ruby and Rails antipatterns that degrade maintainability and performance.

    5.5k GitHub stars~1.1k tokensUpdated 2 days ago
    Backend & APIsAuto-check passed
  • Dependency Safety

    doorkeeper-gem/doorkeeper

    Ensure gems are safe, necessary, and properly constrained when adding, updating, or reviewing dependencies in Doorkeeper.

    5.5k GitHub stars~931 tokensUpdated 2 days ago
    Backend & APIsAuto-check passed
  • Rails Expert

    Jeffallan/claude-skills

    Builds Rails 7+ apps with Hotwire Turbo Frames and Streams, Active Record tuning, Action Cable, Sidekiq jobs and RSpec specs, with migration and N+1 checks.

    12k GitHub stars~1.4k tokensUpdated 6 days ago
    Backend & APIsAuto-check passed
  • Rails Patterns

    affaan-m/ECC

    Ruby on Rails framework patterns for Rails 7.1+ and 8.x apps.

    276k GitHub stars~4.1k tokensUpdated 4 days ago
    Backend & APIsAuto-check passed
  • Ruby Patterns

    softspark/ai-toolkit

    Ruby/Rails: blocks, metaprogramming, ActiveRecord, Sidekiq, RSpec, Sorbet, Hanami.

    179 GitHub stars~2.3k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Rails

    ericrisco/rsc-harness

    A skill your agent uses when building or maintaining a Ruby on Rails app — models, controllers, views, routes and migrations; ActiveRecord associations, scopes and query performance; Hotwire (Turbo…

    174 GitHub stars~3.1k tokensUpdated yesterday
    Backend & APIsAuto-check passed

More from RailsEventStore/ecommerce

All 8 skills in this repo
  • Commit

    RailsEventStore/ecommerce

    Create atomic git commits following project conventions. An agent skill from RailsEventStore/ecommerce.

    507 GitHub stars~767 tokensUpdated 18 days ago
    Auto-check passed
  • Controller

    RailsEventStore/ecommerce

    Create a controller with commands, read model queries, routes, and integration tests

    507 GitHub stars~1.9k tokensUpdated 18 days ago
    Auto-check passed
  • Domain

    RailsEventStore/ecommerce

    Create a new domain bounded context with aggregates, commands, events, and handlers

    507 GitHub stars~2.6k tokensUpdated 18 days ago
    Auto-check passed
  • New Feature

    RailsEventStore/ecommerce

    Plan a new feature end-to-end — impact analysis across all layers, start-from-the-middle slicing into deployable steps, then delegating to /domain, /read-model, /controller skills

    507 GitHub stars~1.6k tokensUpdated 18 days ago
    Auto-check passed
  • Read Model

    RailsEventStore/ecommerce

    Build a new read model following project conventions (event handlers, tests, migration, configuration)

    507 GitHub stars~3k tokensUpdated 18 days ago
    Auto-check passed
  • Upgrade Rails

    RailsEventStore/ecommerce

    Upgrade Rails framework to a newer version following the smooth upgrade methodology

    507 GitHub stars~976 tokensUpdated 18 days ago
    Auto-check passed

Categories

Questions about New App

What does New App do?

Scaffold a new Rails app with event sourcing, following project conventions (todomvc as reference). New App is an agent skill from RailsEventStore/ecommerce.

When should I use New App?

New App fits situations like: tasks that involve Event-driven systems.

How do I install New App in Claude Code?

Run `npx skills add RailsEventStore/ecommerce --skill new-app -a claude-code`. Or copy the skill folder (.claude/skills/new-app in RailsEventStore/ecommerce) into .claude/skills/new-app in your project. Claude Code loads it when a task matches its description.

How do I install New App in Codex?

Run `npx skills add RailsEventStore/ecommerce --skill new-app -a codex`. Or copy the skill folder (.claude/skills/new-app in RailsEventStore/ecommerce) into .agents/skills/new-app in your project. Codex loads it when a task matches its description.

Can I use New App in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add RailsEventStore/ecommerce --skill new-app -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/new-app, .gemini/skills/new-app, .github/skills/new-app and .opencode/skills/new-app in your project.

What does New App need to run?

Going by SKILL.md and its folder, New App needs the command-line tools its instructions call (rails, bundle, gem and make).

Does New App access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is New App safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does New App use?

New App is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does New App use?

About 3.1k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to New App?

Skills that share tags, products or a category with New App: Antipattern Prevention (doorkeeper-gem/doorkeeper, 5.5k stars), Dependency Safety (doorkeeper-gem/doorkeeper, 5.5k stars), Rails Expert (Jeffallan/claude-skills, 12k stars) and Rails Patterns (affaan-m/ECC, 276k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains New App?

RailsEventStore (a GitHub organization) maintains it in RailsEventStore/ecommerce, which has 507 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on September 21, 2026.

Source: RailsEventStore/ecommerce on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.