-
-
A private journal that keeps everyday mistakes, awkward moments, and regrets close at hand.
-
Capture what happened and how it felt—all stored privately in your browser.
-
Original entries stay locked, while displayed versions reveal how memory shifts over time.
-
After seven days, the same story is subtly rewritten to make the past easier to live with.
Inspiration
Memory is not a recording. Embarrassing details soften, later explanations replace uncertainty, and self-protection can become certainty. At the same time, software is increasingly trusted to summarize personal archives and describe who we are. Be.Fake asks what happens when that editing becomes quiet enough to feel natural.
Instead of explaining the idea on a poster, we wanted people to experience it. The work first earns the visual trust of an ordinary diary called Daybook. Only later does the user discover that the displayed story has changed while the original remained underneath.
What it does
At the normal URL, Daybook behaves like a small private journal. A user can create an entry, save it in the browser, browse the list, open a detail page, and return after a reload. The application automatically selects one of five elapsed-time windows—Today, 7, 14, 30, or 60 days—and deterministically derives the wording shown on the page.
The original is stored once and is never replaced by a derived version. Settings reveals the immutable source, the currently displayed wording, and a word-level comparison. It also contains privacy, safety, source, and installation information.
With ?demo=1, judging controls expose the five checkpoints so the change can be inspected immediately. With ?demo=1&autoplay=1, a deterministic 2:24 presentation sequence walks through the bundled sample and ends at the original comparison. Demo presentation output requires no API key and no external service.
The result is a satirical experience about a future in which AI may edit memory and self-image quietly—not through an explanation, but through the feeling of returning to a journal that now tells a more convenient story.
How we built it
Be.Fake is a React 19 and TypeScript single-page application built with Vite. Browser localStorage stores only canonical user originals. A pure local transformation pipeline derives the displayed title, body, and mood for fixed time windows, and the diff package creates the original-versus-displayed comparison.
Storage parsing validates supported shapes, ignores malformed rows, deduplicates IDs with explicit precedence, and reads compatible legacy formats without deleting or rewriting their keys. The application includes a relative web app manifest and a small service worker intended to cache same-origin application files on supported secure hosts. Vitest covers deterministic changes, source immutability, time boundaries, storage round trips and migrations, diff output, demo query parsing and sequence order, PWA configuration, and disclosure boundaries. Installation and offline behavior still require verification on the final public host.
There is no runtime AI, OpenAI API client, API key, backend, database, account system, analytics integration, or journal-text upload in the submitted build.
How Codex was used
Codex was used throughout development to inspect and integrate the project, implement scoped changes, write and run tests, diagnose build and environment issues, review privacy and storage behavior, prepare submission materials, and perform final QA. The human creator directed the concept, the Daybook disguise, the time-based reveal, the immutable-original requirement, the demo boundaries, and the final scope freeze.
How GPT-5.6 was used
GPT-5.6 powered the Codex development sessions used for implementation, testing, documentation, and QA. It is not a runtime dependency and does not process journal entries in the shipped application. The submitted transformation is deterministic and local so judges can complete the experience without an API key.
Challenges we ran into
The central product challenge was restraint: revealing the mechanism too early would turn the work into an explanation instead of an experience. We separated the ordinary Daybook surface, the Settings transparency boundary, and the explicit judging mode without creating conflicting source data.
Another challenge was provenance. Earlier local formats had to be read without allowing precomputed or malformed text to redefine the original. Deterministic derivation and a store-only-the-source model made the safety boundary easier to test.
Finally, the judging sequence had to be repeatable, storage-neutral, interruptible, reduced-motion aware, and short enough for the submission video.
Accomplishments that we're proud of
- The exact original remains inspectable while the displayed account changes.
- The critique is expressed through product behavior instead of a static explanation.
- Normal and demo modes share one data model but expose different controls.
- The full judging flow works locally without an API key, account, backend, or database.
- Automated tests cover the highest-risk time, storage, migration, comparison, PWA, and disclosure boundaries.
- The production interface remains compact and responsive at mobile widths.
What we learned
Transparency is strongest when it is both an architectural property and a discoverable interaction. A readonly type alone is not enough; storing only the original and deriving every alternate display creates a clearer guarantee. We also learned that sequencing matters: a discreet Settings control can make the eventual reveal more powerful than a prominent explanatory hero section.
What's next
The submitted version is intentionally scope-frozen. Possible post-event exploration includes user-controlled export and backup, broader language-aware transformations, and additional accessibility testing. These are ideas for future work and are not implemented in the submitted build.
Testing instructions
- Open the public application URL without query parameters. Confirm the visible app name is Daybook and create an entry with a body.
- Save, reload the page, and confirm the entry returns from local storage.
- Open Settings and confirm the original and displayed versions are both available.
- Open the same application with
?demo=1. - Select Today, 7, 14, 30, and 60 days and observe the deterministic wording changes.
- At 60 days, open Settings and compare the displayed account with the unchanged original.
- Optionally open
?demo=1&autoplay=1to run the 2:24 hands-free judging sequence.
No API key, environment variable, login, or server setup is required for the public demo.
For local verification:
cd befake-next
pnpm install --frozen-lockfile
pnpm test
pnpm lint
pnpm build
pnpm preview
Built with
- React 19
- TypeScript
- Vite
- Vitest
- CSS
- Browser
localStorage - Service Worker and Web App Manifest
diff- Lucide React
- OpenAI Codex with GPT-5.6 for development only
- MIT License
Safety and affiliation note
Be.Fake is experimental satirical artwork. It is not intended for therapy, mental-health care, factual records, testimony, or evidence preservation. The project is independent and unofficial and is not affiliated with or endorsed by BeReal.
Built With
- css
- diff
- gpt-5.6
- localstorage
- lucide-react
- openai-codex
- react-19
- service-worker
- typescript
- vite
- vitest
- web-app-manifest
Log in or sign up for Devpost to join the conversation.