Memory Foyer

Personal project · Tool · 2026

The one repository you can actually open — and the server, not the app, owns the truth.

Context

A spaced-repetition trainer with a small 3D foyer for picking a deck. The flashcard domain is deliberately plain — it is a vehicle for the two things a closed-source portfolio cannot show.

The hard part

Every commercial project I shipped lives in a private repository, so none of my code is readable by anyone deciding whether to hire me. A Unity-only portfolio also says nothing about the server side.

Split the project into five assembly-enforced layers. Domain and Application compile with no engine reference at all, so the scheduling algorithm and session orchestration build and unit-test as plain C#; time enters through an IClock interface.

Made the server authoritative: the SM-2 algorithm exists twice, once as pure C# and once as server JavaScript, each with its own test suite, and the server result overwrites the client cache after every submission.

Made submission idempotent — de-duplicated on session id plus a payload hash, with request validation on every endpoint.

Wrote an offline path that degrades instead of failing: HTTP is primary, an atomic JSON cache is the fallback, and queued sessions drain in order once the connection returns.

Built a Deck Author window in UI Toolkit so deck content stays one diffable file instead of scattered assets.

Covered every layer with tests: twelve edit-mode suites on the client, plus algorithm and HTTP integration suites on the server.

A project that can be read, run and tested by a stranger — and a written list of its own limits, from last-write-wins across devices to the write-ahead log that a production version would need.

Worth calling out

I built this one end to end. These are the parts worth naming.

The architecture
  • Five layers with dependencies pointing inward, enforced by assembly definitions rather than by convention.
  • Domain and Application kept free of UnityEngine so the core is testable without the editor.
  • Dependency injection, async and in-process messaging wired through VContainer, UniTask and MessagePipe.
The server
  • Five endpoints on Express and SQLite with schema-validated requests.
  • Idempotent submission keyed on session id and payload hash.
  • The scheduling algorithm reimplemented server-side as the source of truth.
The honest part
  • A trade-offs section that names what the project does not do and why, instead of hiding it.

More from the project

Memory Foyer screenshot 1 of 2
Memory Foyer screenshot 2 of 2

Project facts

Year
2026
Role
Solo developer
Scope
Client, server, tooling and tests
Engine
Unity 6000.4.1f1, URP
Backend
Node, Express, SQLite
License
MIT
Built
29 April to 20 May 2026 — about three weeks
Scheduling
A published spaced-repetition algorithm, reimplemented server-side as the source of truth
Status
Finished as a personal project — not a commercial-grade product

Tools & techniques

Unity 6VContainerUniTaskMessagePipeExpress + SQLiteNUnitUI Toolkit
Davyd Sarnavskyi · Unity Developer Contact Updated August 2026
▶ PlayView CVContact