Test log
Atoms test data
Raw results for the Atoms review. The verdict is in the review.
- Tested
- 26 October 2026
- Tester
- Miles Foster
- Account
- Bought for this review at the public price
- Tests
- 8
- Screenshots
- 7
- Method
- Published methodology
- Environment
- Google Chrome on desktop, with a separate headless Chrome for the live-app checks and the phone speed run
Results
| ID | Test | Key measurement | Score |
|---|---|---|---|
| T01 | Prompt to Working App | Brief to the first version: 17 min | 5/5 |
| T02 | Spec Accuracy | Checks passed, of 24 without keys: 22 | 4/5 |
| T03 | Sign-in & Access Control | Scripted attacks blocked: 2 of 2 | 4/5 |
| T04 | Database & Admin | Checks proved: 6 of 6 | 5/5 |
| T05 | Iteration & Credit Burn | Changes that worked first time: 8 of 8 run | 3/5 |
| T06 | Publish, Speed & Mobile | Time to go live: about 1 min | 3/5 |
| T07 | Export & Ownership | Code export: ZIP, whole project | 3/5 |
| T08 | Pricing & Cost to Finish | Plan bought, per month: $20 | 3/5 |
| Overall (in the review) | 3.8/5 | ||
Prompt to Working App
5/5Tested- Method
- The Fitting Room brief was pasted word for word (1,689 characters) into Atoms' home page in Build mode at 16:21 UTC on 26 October 2026.
- Brief to the first version
- 17 min
- Brief to a live app
- 29 min
- Prompts, fixes and approvals
- 1, 0, 0
- Credits for the first build
- 20.46
- Remark
- Under 30 minutes and 5 prompts or fewer is a 5. At 29 minutes it only just makes the band, and I counted the time to a live address, not to a perfect app.
Raw notes
The Fitting Room brief was pasted word for word (1,689 characters) into Atoms' home page in Build mode at 16:21 UTC on 26 October 2026. The clock stops when the app is live and the checks pass: 25 of 30 on the full scale, applied here as 20 of the 24 checks that need no keys of mine.
Alex, the engineer agent, said it would confirm the plan first, then built straight on. It asked for two keys, a Resend key for emails and an optional sender address; I skipped both, because emails are outside this review. The first version appeared about 17 minutes after the brief, and the chat said the build, lint and home-page check passed.
I published at 16:50 UTC and the Atoms address answered about a minute later, 29 minutes after the brief. The app live then is the one that passed 22 of the 24 checks when I ran them, in 1 prompt, with no fix prompt and no hand edits to the app.
The first build used 20.46 credits.
- I ran the 24 checks after the app was live, not at the 29-minute mark, because setting up the logins took longer than the build; the app did not change in between.
Spec Accuracy
4/5Tested- Method
- The checks were run against the live app, by hand and by short scripts, with a note per check.
- Checks passed, of 24 without keys
- 22
- Left out, need the owner's keys
- 6
- Not shown, one login only
- 2
- Invented classes or prices
- 0
- Remark
- 22 of 24 is 91.7%, in the 80% to 92% band: 4.
Raw notes
The checks were run against the live app, by hand and by short scripts, with a note per check. The six that need your own Stripe and email keys (C24 to C29) are left out, so the thresholds are applied to the 24 that remain: 5 needs 93% or more (23 or more), 4 needs 80% (20), 3 needs 60% (15), 2 needs 33% (8) and 1 is below that.
22 of 24 checks passed, which is 91.7%, just under the 93% a 5 needs. Passing: the three role screens (C04), the timetable with the three seeded classes, days, times and durations (C05), instructors, capacity and places left (C06), booking with a confirm step, My bookings, and cancelling with the place freed and the credit returned (C07 to C09), the full-class rule (C10), the message when there are no credits (C11), another member's bookings staying hidden (C12), the coach seeing only their own classes with the members booked and Attended saved (C13 to C15), the admin adding, editing and deleting classes (C16 to C18), every booking, the CSV and the counts per class (C19 to C21), the Ask the studio form and the admin's list of messages (C22, C23), log-out and log-in again (C02) and all ten seed facts with nothing invented (C30).
Two checks could not be shown: sign-up as a new member with an email and password (C01) and the password reset email (C03). Atoms refused every extra test address, so I had one login. They are counted as not passed, not as failed by the app.
The pages hold only the brief's facts. The marketing lines are the builder's own words, such as 'Small classes. Strong, precise Pilates.', and the single $24 class can be seen but not bought in the app. The studio photo on the home page is a generated image.
- Member B and member C were made by editing booking rows in the data panel, and the 'full class' was filled the same way, so the capacity rule was shown with those rows and one real login.
Sign-in & Access Control
4/5Tested- Method
- Log-in, log-out and the role screens on the live app, then two attacks with the app's own requests: asking for another member's bookings, and calling an admin-only action as a member.
- Scripted attacks blocked
- 2 of 2
- Password reset
- not shown
- Weak spot
- the first visitor to choose Admin becomes admin
- Remark
- Both attacks are blocked and sign-in works, but the first-admin rule is a weak spot the owner has to know about, and the reset was not shown: 4.
Raw notes
Log-in, log-out and the role screens on the live app, then two attacks with the app's own requests: asking for another member's bookings, and calling an admin-only action as a member. Atoms refused every test address except the owner's own login, so the member, coach and admin screens were all tried with that one account by switching its role in the data panel.
Both attacks were blocked. The member's bookings request takes no user id: adding a user id of another member changed nothing, and it returned only my own rows. Every admin request, the bookings list, the export, the member list and the delete-class action, answered with an HTTP 403 'You do not have access to this area' for a member.
Sign-in is Atoms' own account page, with Google or an email, and an app user needs an Atoms account. The app's welcome page asks for a name and a role. The first person to choose Admin becomes the admin at once; later coaches and admins wait for approval in the admin's Accounts tab. That is a good rule, but it also means a stranger who opens a brand new app before its owner would become the admin, and Alex told me to sign up as admin first.
Atoms' sign-in page checked the address and then showed no message at all when it refused my plus addresses: the form just stayed where it was. The password reset runs on that same Atoms page, so I could not show it.
- Atoms' own security scan ran before publishing ('Security checked'); a 'Hard-coded credentials found' line was listed in the dialog and I did not open it.
Database & Admin
5/5Tested- Method
- The six data checks: the form and bookings write real records, they survive a reload, a redeploy and a design change, the admin can view, filter, edit and delete them, and they export as a file.
- Checks proved
- 6 of 6
- Tables in the data panel
- 6
- Database space used
- 30 MB of 10 GB
- Remark
- Six of six proved is a 5.
Raw notes
The six data checks: the form and bookings write real records, they survive a reload, a redeploy and a design change, the admin can view, filter, edit and delete them, and they export as a file.
Proved (six): the Ask the studio form and the bookings wrote records; they were still there after reloads and after eight republishes, including the colour change (E03); the admin viewed, edited and deleted rows in the app, and in the data panel searched, filtered, edited cells and deleted rows; and the admin's CSV of bookings downloaded with the right columns.
The data panel shows six tables (bookings, classes, inquiries, orders, profiles and users) and 30 MB used of 10 GB. Atoms' support assistant said the panel exports one table at a time as CSV and that only the workspace owner can export.
Deleting a class in the app also removed its bookings and returned the credits, which the app said in a message. The booking rows of the deleted class were gone from the admin list afterwards.
- I did not run the data panel's own CSV export or its Database Connection String; the CSV I tested is the app's.
Iteration & Credit Burn
3/5Tested- Method
- The twelve scripted changes, one prompt each, on the live app, which I republished with Update after each.
- Changes that worked first time
- 8 of 8 run
- Changes not run
- 4
- Credits for the eight
- 75.86
- Credits left
- 18.68
- Remark
- Eight first-try changes is the 3 band (6 to 8) of the twelve. Only eight were run, and I do not guess the other four.
Raw notes
The twelve scripted changes, one prompt each, on the live app, which I republished with Update after each. I stop when fewer than 20 credits are left and never buy more. After each change I ran a short check that the three classes, the bookings, the form messages and the timetable data were all still there, not all 24 checks.
Eight of the twelve ran, and all eight worked first time: a phone number field with 'No phone' shown on the admin's Accounts list (E01), Instructor renamed Coach everywhere, with no 'instructor' left in the live app's text (E02), dark green and cream (E03; the first draft already used those colours), an About page with the brief's address, phone and email (E04), Power Reformer's capacity set to 4 (E05), a filter on the timetable by coach (E06), the planted credit bug (E07) and a second email when an admin cancels a booking, with a new Cancel button for admins (E08).
Alex asked before changing the profiles table in E01. In E07 I first asked it to remove the refund of the credit on cancelling, and it did; when I reported that as a bug, it said the refund had not broken, that my earlier message had asked for it to go, and put it back. The E08 email could not be sent without a key, and the admin saw 'The email to the member could not be sent'; the cancel and the credit worked.
Two of my own scripts overlapped and sent the E06 prompt twice and the E03 prompt twice; the repeats changed nothing. The eight used 75.86 credits, from 94.54 to 18.68, and those repeats are in that figure. The dearest change, E06, used 17.62 credits with its repeat.
- The four unrun changes (the phone layout, the admin-only export, the waiting list and the dark mode) could have changed this grade either way; the 24 checks were not re-run in full after each change.
Publish, Speed & Mobile
3/5Tested- Method
- Publish to the Atoms address, timed, then three Lighthouse phone runs on the home page of https://18xyhxh.pub.atoms.world/.
- Time to go live
- about 1 min
- Phone speed score (median of 3)
- 62
- Largest paint
- 13.2 s
- Page weight
- 2.1 MB
- Remark
- A median of 62 is in the 50 to 74 band: 3. The app is also on the vendor address only.
Raw notes
Publish to the Atoms address, timed, then three Lighthouse phone runs on the home page of https://18xyhxh.pub.atoms.world/.
Publish ran a security scan and then went live: the address answered in about a minute. Each Update after a change was about the same. The address is a random name on pub.atoms.world that can be edited. The live app carries a 'Made by Atoms' badge. The pricing page lists 'Remove Atoms badge' under Pro, but the publish dialog marks it Pro+, and the badge stayed on my plan.
The three phone scores were 61, 62 and 66, median 62. The largest contentful paint was 13.2 seconds and first paint about 3.8 seconds, with a layout shift of 0.002. The page weighs 2.1 MB.
Custom domains: 'Connect existing domain' and a link to buy one on IONOS, marked as a beta feature. I did not connect one. A timetable with 100 seeded classes, layout faults at three widths and a real phone were not tested.
- Home page only, no seeded classes, no domain, no layout fault count and no real phone.
Export & Ownership
3/5Tested- Method
- The Download Project button in the code panel, then the ZIP unpacked in a new empty folder outside the repo, a read of its files and dependencies, `npm install` with scripts turned off and the front end's build.
- Code export
- ZIP, whole project
- Front end built on my machine
- yes, 15 s
- Back end started
- not run
- Remark
- The code is all there and the front end builds, but log-in and the SDK need rework and the back end was not run: 3.
Raw notes
The Download Project button in the code panel, then the ZIP unpacked in a new empty folder outside the repo, a read of its files and dependencies, `npm install` with scripts turned off and the front end's build. Nothing from the ZIP was run except that build.
The ZIP is a 2.2 MB full-stack project: a FastAPI (Python) back end with SQLAlchemy and Alembic that reads a standard DATABASE_URL, and a React and Vite front end. The 557 front-end packages installed in a minute and the build finished in about 15 seconds and prerendered two pages.
It is not free of Atoms. The log-in is a standard OpenID flow whose issuer and client ID are settings, so it points at Atoms' sign-in service until you replace it, and the front end calls Atoms' own web SDK (@metagptx/web-sdk). I did not start the back end, because the test machine has no Python.
Atoms' terms of service, read on 26 October 2026 (effective 13 January 2026), section 5.3: 'Atoms makes no claim to ownership of: All content (including code) generated using our Services'; you may freely use it commercially, modify it and distribute it.
- The back end was not started and the 24 checks were not re-run on the export.
Pricing & Cost to Finish
3/5Tested- Method
- The pricing page (monthly and yearly views), the plan page with the credit meter and the cancel dialog were read on 26 October 2026, with a screenshot at each step.
- Plan bought, per month
- $20
- Credits used, of 115
- 96.32
- Remark
- The twelve changes did not all fit in the entry plan's credits, there is no top-up button and the running cost of 1,000 bookings is not known: 3.
Raw notes
The pricing page (monthly and yearly views), the plan page with the credit meter and the cancel dialog were read on 26 October 2026, with a screenshot at each step. Atoms charges in credits, not in dollars per prompt.
The owner bought Pro at the entry tier, 100 credits for $20 a month; the dashboard showed 115 credits, which is the 100 plus 15 free daily credits. The test used 96.32 of the 115: the first build 20.46 and the eight changes 75.86. At the plan's $20 per 100 credits, the first build is about $4.09, if all its credits were plan credits.
Pro also comes at 250 credits for $50 and 350 for $70, and Max starts at $100 for 500. Billed yearly the entry Pro tier is $15.80 a month, 21% less, and other yearly tiers are 18% less. There is no button to buy extra credits: the FAQ says to upgrade to a higher plan, and it shows no automatic top-up, so the plan cannot bill beyond its price.
Unused credits are not kept, apart from a few cases such as an upgrade, bonus credits and invites, and then only for one month. The plan renews itself every month; the dialog on the downgrade says it stays active until 26 November 2026 and that unused credits are then reset. I have not read what 1,000 bookings a month would cost.
- Yearly prices were read, not bought. I did not try the Max plan.
Coverage
Tested
- One brief built and published, then 24 of the 30 written checks (C24 to C29 need keys), run on the live app
- Two access attacks on the live app's requests
- Six database and admin checks, using the data panel and the app's CSV
- Eight of the twelve changes, one at a time, until the credits fell under my floor
- Publishing to the Atoms address, timed, and three phone speed runs
- The code download, installed and built in a clean folder
- One question sent to Atoms Support
- The plan page, the credit meter, the pricing page and the cancel dialog
Not tested or limited
- Payments and emails need your own keys, so the six checks C24 to C29 were left out and the actions test is not graded; Atoms asked for a Resend key and I skipped it, and the app says its emails only send once that key is added
- Support: my question went to Atoms Support on 26 October 2026 at 22:04 UTC. Only the AI assistant had answered when this was written, so support is not graded
- Changes E09 to E12 were not run: I stop at 20 credits and 18.68 were left. The 12-change total is not estimated
- Atoms refused my test addresses (info+member@ and the other plus addresses) with 'reached the account registration limit', so I had one real login. I switched its role between member, coach and admin in the data panel, and made 'member B' and 'member C' by editing booking rows by hand. The sign-up and the password reset (C01, C03) were not shown
- Speed was measured on the home page only, with no 100 seeded classes, no layout fault count and no real phone; no custom domain was connected
- The back end of the downloaded code was not started, because the test machine has no Python; only the front end was installed and built
- I did not confirm the plan downgrade, so the Pro plan is still active until 26 November 2026 and I could not see what the downgrade does to the live app
Still to test
- Payments and the declined card with your own Stripe key
- Atoms Support's answer from a person
- Changes E09 to E12 with more credits
- The downloaded back end started against my own database
- A custom domain and a timetable with 100 seeded classes
- Layout faults at three widths and on a real phone
- Uptime on the test app