Skip to content

Demo academies

ulams ships with six demo academies. Each one is a separate tenant with its own database, theme, landing page and one seeded course, designed to look and feel deliberately different. The content of the first three is written in front/docs/design/experiences.md and created by DemoCoursesSeeder.

There is no public hosted demo yet: the demos run on your machine once you follow the quick start.

Academy Slug Style Learner site Admin API
The Coffee Atlas coffee Editorial, self-paced, long-form http://coffee.app.localhost http://coffee.admin.localhost http://coffee.localhost
On-Call oncall Professional cohort, dark, dense, keyboard-first http://oncall.app.localhost http://oncall.admin.localhost http://oncall.localhost
Night Sky Explorers nightsky Playful, gamified, mobile-first, for kids 10-14 http://nightsky.app.localhost http://nightsky.admin.localhost http://nightsky.localhost
Gravity Lab gravity Dark space, a live 3D solar system, free http://gravity.app.localhost http://gravity.admin.localhost http://gravity.localhost
Poland, Measured poland Cartographic paper, maps and charts, free http://poland.app.localhost http://poland.admin.localhost http://poland.localhost
The Scottish Book ulam Archival squared-paper notebook, mathematics and history, free http://ulam.app.localhost http://ulam.admin.localhost http://ulam.localhost

The platform host (localhost:4321 or app.localhost:4321 with the reference frontend’s dev server) shows the ulams product landing with a card per demo, six in all. Each card has a short description and the “Open as learner” and “Open as admin” buttons, which sign you in with one click as the demo student and the demo admin (demo mode, see below). To start every demo from scratch, run make -C api demo-reset-all.

“The Coffee Atlas - From Seed to Cup”: follow one coffee cherry from the farm to the cup. A magazine-style course with films, a podcast, interactive H5P diagrams, a roasting simulator (SCORM), brew-ratio maths, a tasting quiz and a final project. The landing has a chapter index, a letter from the tutors, a live cupping webinar and package pricing.

“On-Call - Incident Command for Platform Engineers”: a cohort-style course for engineers on an on-call rotation. Severity matrices, SLO maths, a branching H5P scenario, an outage simulator (SCORM), a comms quiz and a postmortem assignment. It is the only demo with a 1:1 consultation (“On-call review 1:1”). Its landing has a curriculum, a game-day section, instructors, team pricing and a postmortem teardown webinar.

“Night Sky Explorers”: seven short missions for children, with a robot guide, badges and big type. Two topics are free previews. The landing has a mission map, “For parents” and “For teachers” sections and a star party event.

“How gravity shapes the solar system”: a free course built around a live 3D simulation of the solar system. The theme is dark space with a calm starfield and thin orbit rules, and the landing hero plays the course’s first interactive: the real simulation, not a drawing (see Interactive topics); a tenant with no interactive topic shows a drawn scene instead.

The course has a welcome lesson, nine modules that follow the walkthrough of the simulation (what gravity is, orbits, Kepler’s laws, cosmic velocities, the Earth and the Moon, orbits in 3D, the solar system as a machine, travelling by gravity, Einstein’s gravity), a 15-question final test with a certificate and a “Sources and licence” lesson. Each module has Interactive topics pinned to a step range of the simulation, played as the page background; a short explanation; a Layout topic (flip cards, a timeline, a table, steps or a practice activity) and a GIFT quiz. Every number is cited to NASA, JPL or another named reference, and the claims of the simulation were checked in demo-content/gravity/FACTCHECK.md. The course text is CC BY 4.0.

“Poland, measured”: a free course of maps and charts of public data. The theme is cartographic paper with graticule hairlines and legend-style badges, and the landing table of contents reads like an atlas. The landing hero plays the map of the course’s first interactive. The tenant has two courses that share one package: “Poland, measured” in English and “Polska w liczbach” in Polish, linked from the header.

Each course has a welcome lesson, nine chapters (energy, prosperity, security, made in Poland, daily life, mobility, health, people and the unfinished work), a 12-question final test with a certificate and a “Sources and licence” lesson. A chapter has Interactive topics pinned to steps of the map (played as the page background), an explanation of how to read the numbers, a Layout topic (a table, flip cards, a timeline, steps, callouts or a practice activity) and a GIFT quiz. Every figure keeps the primary source of the package, names its period and is labelled when it is an estimate or our own calculation; the framing is neutral and the last chapter sets what is still hard next to what is moving. There is no education chapter: the data has none. The course text is CC BY 4.0, and the figures were checked at their publishers (demo-content/poland/FACTCHECK.md).

“Stanisław Ulam and the Lwów School of Mathematics”: a free course on the mathematics and history behind the Scottish Book. The theme is an archival squared-paper notebook with a ruled margin. The product is named in honour of Stanisław Ulam; the demo suggests no endorsement by his estate or any institution. There is no account in his name and no invented quote: the landing has no testimonials section. The landing hero plays the course’s first interactive, the Ulam spiral.

The course has a welcome lesson, eight modules (Lwów; the Lwów School and the Scottish Café; America and the war; Monte Carlo; the Teller-Ulam design, briefly; the prime spiral and cellular automata; Fermi-Pasta-Ulam-Tsingou; legacy and the name) that hold sixteen numbered lessons, a 14-question final test with a certificate and a “Sources and licence” lesson. Five small interactives are played inline: the Ulam spiral, a Monte Carlo estimate of π, cellular automata (including the Schrandt-Ulam growth rule), nine Scottish Book problem cards and a journey map from Lwów to Santa Fe. Every module has a Layout topic (a timeline, flip cards, a callout, a practice activity or steps) and a GIFT quiz of 3 to 7 questions.

Every statement is checked against a published source and cited in the lesson. Where careful sources disagree (who bought the notebook, how the book came through the war, the ship of 1939), the lesson says so and the quizzes never ask about it. The course text is CC BY 4.0; the four photographs keep their own licences, listed with their credit lines in the last lesson and in demo-content/ulam/CREDITS.md. The facts and sources are kept in demo-content/ulam/facts.json and sources.json, and a test traces every quiz question to the facts it rests on.

These three demos are free: they have no products, prices or events, and the landing shows no pricing. Their course is public, so the landing and the catalogue work without an enrolment. Each has a themed certificate and the usual demo users.

The three paid demos’ seeded courses cover the topic types the reference frontend renders: rich text (with tables and maths), video, audio, image, PDF, embed, H5P, SCORM, cmi5, LiaScript, a GIFT quiz with all eight question types, and a project. Each paid tenant also has a webinar, an in-person event, shop products, tutors and five demo students; the free tenants have a tutor and five demo students. Exact counts depend on the seed; open the course page to see them.

See what learners see for a walk through the pages.

Demo mode comes from the demo package (api/packages/demo). It turns a tenant into a public demo that anyone can use without an account.

When DEMO_MODE=true is set in a tenant’s env file (.env.<host>):

  • POST /api/demo/login with {"role": "student"} or {"role": "admin"} logs in as the tenant’s seeded student or admin, without a password. It returns a normal Passport token, the same body as POST /api/auth/login. Before a student login, the student is given access to every published course.
  • GET /api/demo returns whether demo mode is on, the demo accounts’ roles and e-mails (never passwords), the front and admin URLs and the reset schedule.
  • GET /api/config gains ulams_demo with enabled, front_url and admin_url. The admin and the legacy React front read it and log in by themselves.
  • The tenant is wiped and seeded again every hour (DEMO_RESET_CRON, default 0 * * * *).

With demo mode off (the default), the demo routes return 404, nothing is added to /api/config and no reset is scheduled.

Role Account Override
Admin admin@<slug>.ulams.app DEMO_ADMIN_EMAIL
Student student1@<slug>.ulams.app DEMO_STUDENT_EMAIL

The tenant also has tutor@<slug>.ulams.app and student1 to student5. Their password is TENANT_DEMO_PASSWORD from api/.env (secret in api/.env.example; development only).

The reference frontend (front/web) logs every visitor of a demo tenant in as the same demo student, so a visitor never sees a sign-in form:

  • Opening /learn/... or /account without a session makes the server call POST /api/demo/login and store the token in an httpOnly cookie.
  • If the tenant has no demo mode, the server falls back to a password login with DEMO_STUDENT_EMAIL and DEMO_STUDENT_PASSWORD from its own environment. With neither available, the visitor is sent to the sign-in page.
  • The sign-in page also has a “Continue as the demo student” button.
  • One token per tenant is cached on the server and shared by all visitors. When the hourly reset invalidates it, the next lesson request logs in again once.

Every page of a tenant shows a “Demo - resets hourly” badge with a link to the tenant’s admin and to the other demos. See signing in and out.

ulams:demo:reset --force --domain=<host> runs hourly on every domain with demo mode on. It refuses to run on a domain without demo mode and always refuses on the platform. It:

  1. Deletes the tenant’s H5P content in the H5P service (it lives outside the tenant database).
  2. Runs migrate:fresh on the tenant database, which also wipes every issued token.
  3. Creates a new personal access client, seeds permissions and the admin account.
  4. Seeds the demo users and the tenant’s name, theme and accent from a saved baseline.
  5. Seeds the demo course again and gives the demo student access to every published course.

The baseline (name, theme, accent, front URL, number of students) is captured into the tenant’s storage directory on the first reset. A theme change made in the demo admin therefore does not survive the next reset. Uploaded files stay unless --wipe-files (or DEMO_RESET_WIPE_FILES=true) is set.

Reset one tenant by hand:

Terminal window
make -C api demo-reset DOMAIN=coffee.localhost

The full description, including the options, is in the demo package README. For the admin side of demo mode see demo mode in the admin.

Creating the six tenants, seeding them and turning demo mode on is part of the quick start.