
Mountable Rails engine providing 24+ cybersecurity escape room scenarios with randomized passwords, JIT-compiled NPC dialogue, and RESTful API for game state management. Designed for hands-on security training.
Cybersecurity training escape room game as a mountable Rails Engine.
In your Gemfile:
gem 'break_escape', path: 'path/to/break_escape'
Then:
bundle install
rails break_escape:install:migrations
rails db:migrate
rails db:seed # Optional: creates missions from scenarios
In your config/routes.rb:
mount BreakEscape::Engine => "/break_escape"
export BREAK_ESCAPE_STANDALONE=true
rails server
# Visit http://localhost:3000/break_escape/
Mount in Hacktivity or another Rails app. The engine will use the host app's current_user via Devise.
# config/initializers/break_escape.rb
BreakEscape.configure do |config|
config.standalone_mode = false # true for development
config.demo_user_handle = 'demo_player'
end
break_escape_missions - Scenario metadata (name, display_name, published, difficulty)break_escape_games - Player state + scenario snapshot (JSONB)break_escape_demo_users - Standalone mode only (optional)GET /games/:id/scenario - Scenario JSON (ERB-generated)GET /games/:id/ink?npc=X - NPC script (JIT compiled from .ink)GET /games/:id/bootstrap - Initial game dataPUT /games/:id/sync_state - Sync player statePOST /games/:id/unlock - Validate unlock attemptPOST /games/:id/inventory - Update inventoryScenarios are stored as .json.erb templates and rendered on-demand with randomized values:
<%= random_password %> - Generates unique password per game<%= random_pin %> - Generates unique 4-digit PIN<%= random_code %> - Generates unique hex codeNPC dialogue scripts compile on first request (~300ms):
.json exists and is newer than .inkinklecate to compilePlayer state stored in JSONB column:
Tests run automatically on GitHub Actions. The committed Gemfile.lock pins the exact gem versions used.
bundle install
bundle exec rails db:create db:migrate RAILS_ENV=test
bundle exec rails test
The engine ships with a bin/setup script that bootstraps the bundle from a sibling Hacktivity checkout (which already has all the required gems vendored):
# From the BreakEscape root — Hacktivity must be at ../Hacktivity
bin/setup
bundle exec rails test
# If Hacktivity is elsewhere, set HACKTIVITY_DIR:
HACKTIVITY_DIR=/path/to/Hacktivity bin/setup
bin/setup copies the resolved .gem files into vendor/cache/ and runs bundle install --local. The vendor/cache/ and vendor/bundle/ directories are gitignored; only Gemfile.lock is committed.
See HACKTIVITY_INTEGRATION.md for integration guide.
Many thanks to everyone who has contributed to the project. Please refer to the GitHub history.