Adrian Marin's wroclove.rb 2022 talk walking end-to-end through packaging a Rails engine as a distributable gem. Covers: what a Rails engine is (a miniature Rails app with its own routes, models, controllers, views, mounted inside a host app); when to use engines (e.g. a marketplace with separate buyer/seller namespaces) vs generating shareable frameworks like an admin panel; generating a mountable engine with `rails plugin new admin --mountable` and the dummy test app inside `test/`; the gemspec as the 'package.json of Ruby' — metadata, homepage/bug-tracker links, the files option, runtime dependencies (e.g. `spec.add_dependency 'pundit'`) and the engine's internal Gemfile for dev dependencies; building with `bundle exec rails build`; building in isolation via a Docker image (Ruby base, nokogiri caching layer, bundler install, build, then `docker cp` the gem out) to avoid polluted local env/assets; publishing with `gem push`; versioning with the `bump` gem (bump pre/minor/major/patch, auto-commit, tag and push); changelog options (CHANGELOG.md, Confluence, docs, GitHub Releases attached to git tags). Then automates the whole workflow with GitHub Actions: test workflow with a matrix of Ruby 3.0/3.1 × Rails 6/7, Postgres service, actions/checkout, ruby/setup-ruby, capybara failure screenshot upload via actions/upload-artifact, codecov action; lint workflow using reviewdog with Standard RB and ESLint posting inline PR suggestions; PR labeling by branch prefix (feature/, fix/, chore/, refactor/) via pr-labeler; release-drafter to auto-generate categorized release notes with contributor attributions on every merge to main; and a release workflow triggered on `v*.*` tags that checks out, builds the gem, fetches the drafted release notes, creates a GitHub Release with the gem attached as an asset, and finally `gem push`es to RubyGems. Closes with the engine asset-pipeline problem: either hook into the host app's asset pipeline (requires Node.js etc. on the host) or pre-compile assets at build time inside `public/admin-assets` using jsbundling with esbuild + Tailwind scripts in package.json, and serve them via a `Rack::Static` middleware registered in the Engine class that maps `/admin-assets` to the engine's `public/` — letting the host app stay oblivious. Ends with community shout-outs to Ruby Romania, the Short Ruby Newsletter by Lucian Ghinda, and a 'be kind, build useful things' call to action. Q&A covers engines vs namespaces in growing monoliths, packaging an engine with Webpacker, and strategies for avoiding model duplication across engines.