Progress

Real Rails apps, measured against Rails. Early, and not ready for production.

Results of 8 Nov 2026Start contributing About these numbers

Latest app results

Latest results. Each check measures something different, so they aren’t added into one score.
CheckLatest resultAt a glanceWhat this tells us
Lobsters · model specs Not availableCouldn't load this source.
Lobsters · frozen replay 0 / 4 completed Roundhouse · YJIT: stopped at replay✕Roundhouse · no JIT: stopped at replay✕Roundhouse · AOT: stopped at emit✕Futamura · YJIT: stopped at bundle✕ Compiled configurations. Route agreement is unknown.
Blog + Campfire · archive smoke 7 / 7 passed Blog · JRuby: passed✓Blog · Ruby: passed✓Blog · Rust: passed✓Blog · Spinel: passed✓Blog · TypeScript: passed✓Campfire · Docker image: passed✓Campfire · Spinel: passed✓ Does each published archive start and serve? Selected checks only.
Blog · /articles speed 10.0× Rails’ throughput Rails: 1×RailsGenerated Ruby: 10.0×Roundhouse CRuby + YJIT, one worker, median of 3 runs. Speed doesn’t show parity.

Where to help

Couldn't load this source. The report has the latest result.

The failure groups

Couldn't load this source. The model specs run Lobsters’ own tests against the emitted Ruby; the report has the latest result.

Frozen Lobsters replay

8 Nov 2026

Raw results

A fixed Lobsters snapshot, replayed on Rails and on the compiled app. Rails is the reference. No compiled configuration completed the latest run, so route agreement is unknown.

  • Rails · YJIT✕ Stopped at bundle
    bundle not installable in ruby-bench/benchmarks/lobsters

    Reference

  • Rails · no JIT✕ Stopped at bundle
    bundle not installable in ruby-bench/benchmarks/lobsters

    Reference

  • Roundhouse · YJIT✕ Stopped at replay
    roundhouse: ingest ruby-bench/benchmarks/lobsters: unsupported construct in ruby-bench/benchmarks/lobsters/config/application.rb: config.load_defaults must name a literal version to determine JSON es…

    Unavailable: the replay didn't complete

  • Roundhouse · no JIT✕ Stopped at replay
    roundhouse: ingest ruby-bench/benchmarks/lobsters: unsupported construct in ruby-bench/benchmarks/lobsters/config/application.rb: config.load_defaults must name a literal version to determine JSON es…

    Unavailable: the replay didn't complete

  • Roundhouse · AOT✕ Stopped at emit
    roundhouse: ingest ruby-bench/benchmarks/lobsters: unsupported construct in ruby-bench/benchmarks/lobsters/config/application.rb: config.load_defaults must name a literal version to determine JSON es…

    Unavailable: the replay didn't complete

  • Futamura · YJIT✕ Stopped at bundle
    bundle not installable in ruby-bench/benchmarks/lobsters

    Unavailable: the replay didn't complete

Recorded route gaps 2

  • /hottestthis snapshot's Story#as_json serializes a nested record (`submitter_user: user`), which the render-json monomorphizer declines, so the emit answers this route with its html armLedger: in progress

    config/routes.rb pins `get "/hottest" => "home#index", :format => "json"`, so Rails serves JSON here and the AOT lane serves the HTML page. The respond_to flattening ledgers the dropped arm as a lower_residue warning (src/lower/controller/body.rs). Current upstream lobsters, whose Story#as_json writes `submitter_user: user.username`, is monomorphized end to end (src/lower/as_json_poro.rs, as_json_writer.rs).

    What closes it: nested-record encoding: Story's writer calling User's, where User#as_json is the attrs + super(only:) idiom with four row-dependent keys, a pluck, and keybase_signatures (an Array of Hashes, which needs its own encoding) In the ledger since 2026-08-03.

  • /u/:usernameMarkdowner.to_html is a raising facade -- the AOT tree ships no CommonMark rendererLedger: not started

    User#linkified_about renders markdown at REQUEST time, so unlike the markeddown_* columns it cannot be precomputed. The facade raises rather than returning wrong HTML, which is why this route answers 500 instead of a wrong 200.

    What closes it: a Commonmarker/Markly facade over an iterative Node#walk plus the DOM surgery Markdowner does (h1-h6 to strong, images to links, rel=ugc, @mention linkifier); scripts/markly-conformance already carries vectors generated from the real gem In the ledger since 2026-08-03.

Workload: frozen 114-visit sequence, in-memory, in-process, single-threaded.

Archive smoke checks

8 Nov 2026

The run

Does each published archive start and serve? 7 of 7 selected checks passed. These are smoke checks: they don’t measure all of Rails, or everything an app does.

Blog
  • JRuby: Passed
  • Ruby: Passed
  • Rust: Passed
  • Spinel: Passed
  • TypeScript: Passed
Campfire
  • Docker image: Passed
  • Spinel: Passed
7 more checks weren’t selected for this run
  • Blog: C#. Its check reported success.
  • Blog: Crystal. Its check reported success.
  • Blog: Elixir. Its check reported success.
  • Blog: Go. Its check reported success.
  • Blog: Kotlin. Its check reported success.
  • Blog: Python. Its check reported success.
  • Blog: Swift. Its check reported success.

0532778

Reference blog speed

8 Nov 2026

Methodology

Generated Ruby serves the reference blog’s /articles at 10.0× the requests per second of Rails: CRuby + YJIT, one worker, median of 3 runs. Speed says nothing about parity.

Generated Ruby against Rails on the same runtime
EndpointCRuby + YJITCRuby, no JITJRubyTruffleRuby
/articles10.0×4.5×11.1×4.1×
/articles/110.6×3.8×13.6×5.0×
/articles/new9.1×3.4×13.1×4.9×
/articles.json4.8×2.3×9.6×2.4×
/articles/1.json3.1×1.9×7.9×2.3×
All configurations on /articles
Configurationreq/sp50 msp99 msRSS MiBreq/s per GiBRunsError responses
crystal16,2134.14.725657,51730
csharp33,3321.45.6127268,72130
csharp-aot38,1721.54.472539,26030
elixir7,3567.819.712162,07930
go5,24611.729.434156,24530
jruby11,0275.78.111489,83330
kotlin48,8841.14.752595,35230
python4,63813.814.08257,74730
rails261238.7358.435375930
rails-int411151.4214.63311,27130
rails-jruby99159.888.5114688630
rails-truffleruby1,84731.055.716121,17330
ruby2,61724.240.814518,47730
ruby-int1,85034.547.812814,84430
rust53,3471.12.3173,170,41130
spinel9,3026.611.578122,76930
swift13,8344.47.946308,89130
truffleruby7,5507.918.57829,88430
typescript9,3936.68.131730,30730

Generated Ruby against Rails on the same runtime. Environment captured 8 Nov 2026 at add586f.

The people building it

8 Nov 2026

GitHub

187 pull requests merged in 7 days, by 12 people; 1,330 in all. Merges measure activity; the app results above measure progress.

Merged per week. * This week, so far.
Weekly counts
Week ofMerged
2 Nov 2026 (so far)177
26 Oct 2026208
19 Oct 2026241
12 Oct 2026184
5 Oct 2026279
28 Sep 2026205
21 Sep 20264
14 Sep 202628

Welcome 11

11 people had their first pull request merged in the last 30 days.

Merged work in 30 days 25

  • Ahmad-Othman
  • andrzejkrzywda
  • Animesh-Ghosh
  • aristotelesbr
  • baron-hines
  • brodienguyen
  • bunnykong
  • calmacleod
  • dai199
  • dchuk
  • deepj
  • dersam
  • eddygarcas
  • gregmolnar
  • Hitoshi-Noborikawa
  • iberianpig
  • jonasporto
  • ljachymczyk
  • MatheusRich
  • namespaceMarcello
  • roger-wilco-forever
  • rubys
  • thomasklemm
  • tobi
  • webit-wagner

Alphabetical, never ranked.

Latest merges

Your first contribution doesn’t have to be a compiler patch.

Search for related work, then share your reproducer on an existing or new issue, so two people don’t chase the same failure. Contributors talk in a chat room that runs on Campfire, compiled by Roundhouse on Spinel; once you’ve opened an issue or pull request, ask there for an invite.

About these numbers

status.json · history

Model examples are Lobsters’ own tests; the frozen replay is a recorded request workload; smoke checks start each published archive; benchmarks time one reference app. They test different things, so they aren’t added into one score, and none of them counts Rails features.

Smoke checks don’t measure all of Rails, or everything an app does; Rails coverage is the hand-kept feature map. Published without a named check: Blog: Rails source, Blog: Futamura, Blog: TypeScript, in a worker.

SourceObservedThis build
Lobsters model specsNot publishedNot found
Frozen Lobsters replay8 Nov 2026, 10:17 UTCCollected
Frozen route ledger8 Nov 2026, 17:51 UTCCollected
Archive smoke checks8 Nov 2026, 18:18 UTCCollected
Reference blog benchmarks8 Nov 2026, 05:02 UTCCollected
Merged pull requests8 Nov 2026, 11:57 UTCCollected 8 Nov 2026, 11:57 UTC; refreshed daily
Labelled issues8 Nov 2026, 11:57 UTCCollected 8 Nov 2026, 11:57 UTC; refreshed daily
CI runs on main8 Nov 2026, 11:57 UTCCollected 8 Nov 2026, 11:57 UTC; refreshed daily

Release snapshots record dated claims; this page is rebuilt with the site.