Christoforos Sisamos
Portfolio
sisamos.net CV Download

Software designed, built and shipped.

Everything below is live. Each one is a thing you can open and use, most of them take real payments, and none is a mockup or a case study written after the fact. Each project starts with a summary; "How it's built" has the technical details.

Limassol, Cyprus

Symposio Live

The going-out app for Cyprus: what is on, tickets, tables and the bill.

Symposio's map of Limassol at night, with glowing bubbles for each event and a bar reading 79 events.
Tonight's events on a live map.
A venue's digital menu with cocktails, two items in the cart and a View cart button.
A venue's menu: order and pay from the table.
An organiser's event page with positions to fill, a headline DJ and a support act filled, and three performers, two confirmed.
An organiser booking performers for an event.
A DJ's dashboard: two booking requests awaiting a reply, and earnings with pending payouts.
An artist's bookings and payouts.

A going-out app for Cyprus and the platform behind it. Customers find events, buy tickets, book tables, order and pay from their table, split the bill, and book rides and stays. Venues and organisers manage floor plans, door check-in, menus, staff and events in it, and artists and 105 trades take bookings and get paid through it. On the App Store and Google Play, in four languages.

How it's built

For customers

Events are shown on a map and on city pages, with natural-language search. A ticket carries a QR code that is scanned at the door; tables can be booked or waitlisted; at the table the menu is on the phone, orders go straight to the venue, and the bill can be split. Symposio Balance, messages, reviews and tips are in the same account.

For venues, organisers, artists and trades

Venues build a floor plan and take reservations on it, check guests in at the door by QR code, and publish their menu. AI reads a photo of a paper menu into a digital menu, and reads an existing floor plan (an architect's drawing, a fire-evacuation plan or a POS table map) into draft tables. Staff, rotas, deals and paid promotion are managed in the same place, on eight subscription tiers. Organisers book performers for a lineup; artists and 105 trades take bookings and track earnings and payouts.

Rides, stays and delivery

Community ride sharing, with no money passing through Symposio by design; ride requests home after an event; accommodation bookings with calendar sync and payment by Balance; and delivery run by the venue.

Payments

Sellers are Stripe Connect Custom accounts on the Accounts v2 controller API, onboarded inside the app with Stripe's embedded components. Every payment is a destination charge made on behalf of the seller, so the seller is the merchant of record under its own category. The platform fee is set per provider and split between the two sides of a booking. Symposio Balance and venue Ad Credit are closed-loop credit, never cash: promotional and purchased credit are tracked separately, and refundable amounts are calculated from the transaction ledger, not from a balance.

Real time

The live map uses the Realtime Database: each person's location is written every eight seconds, and only people with a ticket or a role at the event can share it. Calls, group calls and event rooms are WebRTC written in-house, signalled through Firestore, peer to peer, and relayed through Cloudflare TURN only when a network requires it.

The apps

Android and iOS wrap the same web codebase, with native code where it is needed: 36 Kotlin files on Android (sign-in, bookings, messages, earnings, calling, and an integration with Google's Navigation SDK) and, on iOS, a call manager, trip navigation, and notification and share extensions, built with XcodeGen.

Infrastructure

51 Cloud Functions in europe-west1, each loading only the modules it needs, a change made after a 128 MiB out-of-memory error once stopped all push notifications. One scheduler function replaced 22 scheduled jobs; jobs that move money keep their own schedules. The server verifies an App Check token from every client, the database is a named one in the EU, and the security rules have their own tests. Text, images and ads are moderated by AI before they are published. Server-side AI runs keyless on Vertex AI; image AI runs on the phone, so photos of a venue never reach Symposio's servers. An admin console monitors system health and requires re-authentication for any action involving money, and the deploy script detects and deploys every function a change affects.

Integrations

Sign in with Symposio is an OpenID Connect provider, with a published discovery document and key set; the Arcade uses it for sign-in. Venues and artists can embed their Symposio card on their own website with one snippet.

Built with React 19, React Router 7, Firebase (Auth, Firestore, Realtime Database, Cloud Functions, Storage, App Check), Stripe Connect, Gemini on Vertex AI and Firebase AI Logic, WebRTC, Leaflet, Cloudflare R2 and TURN, react-i18next, and Kotlin and Swift for the native apps.

symposio.net

Download on the App Store Get it on Google Play

On the App Store (apps.apple.com/app/id6767295521) and Google Play (play.google.com/store/apps/details?id=net.symposio.app).

ARGO Live

Operations software for estate agencies in Cyprus: property, yachts and cars.

ARGO's page showing a buyer's WhatsApp message in Russian at 23:40 and a drafted reply in Russian offering two villas, written in four seconds and waiting for one tap to send.
A buyer's WhatsApp message at 23:40 and the reply ARGO drafted in Russian, waiting for approval.
The demo agency's public listings: villas, a yacht and a car, each with a photograph, a price and a place.
The demo agency. All listings, prices and photos are fictional.

One system for an estate agency's listings, buyers, documents and sales, from first enquiry to completion. It reads each enquiry, matches it against the agency's listings and drafts a reply in the buyer's language, which a person approves before it is sent.

How it's built

What it covers

Listings, imported from Kyero-style XML feeds and checked hourly for new ones; buyers, each with a saved brief shared across every channel they use; documents; deals, tracked through seven stages from interest to completion; and a daily morning summary for the agency, where the facts are computed in code and the model only writes the text, with a plain list as the fallback if the model is unavailable.

The AI

Three Claude models, chosen per task: Haiku 4.5 for extraction and classification, Sonnet 5 for valuations and summaries, and Opus 5 for all customer-facing text, chosen after comparing output in four languages. Deterministic matching decides which properties are mentioned; the model only writes the text, is instructed not to invent anything, and includes the AI disclosure required by the EU AI Act. A test fails the build if any model is referenced outside the single gateway, and each agency has daily and monthly AI spending limits, checked before every call.

The website widget

One script tag on the agency's own website. It renders inside a shadow root, so the site's CSS cannot affect it, and only responds to domains the agency has registered.

Infrastructure and security

14 Cloud Functions and two scheduled jobs in europe-west1. Agencies are isolated from each other by 329 lines of Firestore security rules, tested against the emulator; the single secret is bound only to the functions that need it; the feed fetcher is protected against server-side request forgery, with 44 attack tests; and six tests check that every feature is actually connected and reachable.

Built with Firebase (Firestore, Cloud Functions, Hosting) in europe-west1, Claude (Haiku 4.5, Sonnet 5, Opus 5) behind one gateway, the Meta and WhatsApp Business platforms for messaging, Resend for email, and a human approval step before anything is sent.

argo.sisamos.net the demo agency

Philokalia Live

An interactive encyclopedia of Eastern Orthodox Christianity, navigated as a 3D galaxy with real orbital physics, or as atoms and molecules.

The Divine Liturgy selected on the Philokalia map: a black disc edged in gold, a thin bright accretion disc crossing in front of it, and related topics such as the Great Entrance and the Proskomedia on coloured orbits around it.
The Divine Liturgy selected: drawn as a black hole, with its 30 connected topics in orbit.
Holy Tradition drawn as an atom: a glowing nucleus with electrons on crossing elliptical orbits in green, red and gold.
Atomic view: Holy Tradition has 12 connections, so it is drawn as magnesium, with electrons on Bohr-Sommerfeld orbits.

An encyclopedia of Eastern Orthodoxy with 388 topics and 1,482 connections, every claim sourced. It is navigated as a 3D galaxy: selecting a topic makes it the centre of a planetary system, with its connected topics orbiting under Kepler's laws, and the eleven most important topics are drawn as black holes with physically based light bending. A switch changes the whole map to an atomic view, with each topic drawn as an atom.

How it's built

Content

388 topics, from the Trinity and the Ecumenical Councils to 148 saints, with 1,482 connections. Every claim cites a patristic, conciliar or scholarly source, and the content was reviewed for doctrinal accuracy against Orthodox sources. It includes the 274 canons of the Apostles and the Ecumenical Councils in Greek with an English translation, a liturgical calendar with the feasts, fasts and saints of every day of the year, 260 hand-selected icons and photographs, a quiz generated from the map, and a prayer-rope counter.

Navigation and orbits

Each topic is a point in a 3D galaxy: colour shows its category, size its number of connections, and brightness its importance. The camera uses true perspective: zooming flies toward the point under the cursor or finger, and dragging rotates about the screen's axes, including upside down. Selecting a topic makes it the star of a planetary system, with its connected topics on elliptical orbits that follow Kepler's laws: the star at one focus, faster motion close to it, and orbital periods proportional to orbit size to the power 1.5. An orbit's eccentricity reflects how closely the two topics are related. Each category orbits in its own plane, related planets fall into orbital resonances, paired topics sit at Trojan points 60 degrees apart, and topics linked by opposition, such as a heresy and its condemnation, orbit in the opposite direction.

Black holes

The eleven most important topics are drawn as black holes when selected, using physically based optics: a Schwarzschild shadow; a thin accretion disc starting at the innermost stable circular orbit, whose image is bent by Beloborodov's light-bending approximation so the far side of the disc appears above the shadow; a photon ring and a secondary image; Doppler beaming and gravitational redshift in the disc's colour and brightness; and gravitational lensing of the stars and orbits behind. Orbits around a black hole precess (Schwarzschild precession), as observed for the star S2 around the black hole at the centre of the Milky Way.

Atomic view

A switch changes the map to an atomic view. A selected topic is drawn as an atom with one proton per connection and the neutron count of that element's most abundant stable isotope. Its electrons fill subshells by the Madelung rule, the Pauli exclusion principle and Hund's rule, including the measured exceptions, and each moves on the Bohr-Sommerfeld orbit given by its quantum numbers. The whole map becomes a set of molecules: two topics are bonded when each is among the other's four closest relations, and molecular shapes follow VSEPR (linear, trigonal, tetrahedral).

Built with hand-written JavaScript on a 2D canvas, with no framework and no runtime dependencies: the renderer, camera and physics are all written from scratch and covered by 28 test suites, each test verified by reintroducing the bug it checks for. A Node build step prerenders every page; Firebase Hosting, and Cloud Functions for readers' messages and a daily post of the day's saints. No analytics, and a strict content security policy.

philokalia.casa philokalia.casa/graph

Arcade Live

Nineteen arcade games in a browser, ten of them for two players at once.

The Sisamos Arcade menu: a grid of game cards from Tetris to Reversi, two-player ones marked 2P, each showing its top score and who holds it.
Each game has a shared top-ten leaderboard.
Play a friend: a QR code, the room code 87PFW and a button to send the link, waiting for someone to join.
Two-player invite: a room code and a QR code to join the same match.

Browser games written from scratch on canvas, with no game engine. Each game has a shared top-ten leaderboard, and ten support real-time two-player matches, joined by link or QR code.

How it's built

The games

Tetris, Snake, Flappy, Bricks, Paddle, Invaders, Rocks, Muncher, 2048, Minesweeper, Crossing, Echo, Lander, Cycles, Missiles, Battleship, Noughts and Crosses, Four in a Row and Reversi, each written from scratch on a canvas. The two-player games are Tetris, Snake, Bricks, Paddle, 2048, Cycles, Battleship, Noughts and Crosses, Four in a Row and Reversi.

Multiplayer

Each match is a Realtime Database room identified by a five-letter code. Player presence uses a heartbeat rather than message traffic, so briefly switching apps does not make a player look disconnected. Invite links open directly into the match and show a preview card in chat apps; a QR code does the same in person. Rooms are removed when the players leave, and anything older than six hours is deleted by a free Cloudflare cron job instead of a paid scheduler.

The leaderboard

One row per game and player, written only if it beats that player's previous score, never above the game's maximum, no more often than every three seconds, and with a timestamp set by the server.

Accounts

Every player is signed in anonymously on the first visit, so guest scores are still attributed. Sign in with Symposio is standard OpenID Connect (authorisation code flow with PKCE, verified against Symposio's published keys) and syncs scores across devices.

Testing

Ten suites and about 460 checks, including two real clients playing each other through the live database, every game played by a headless browser, and the QR encoder compared against an independent library.

Built with vanilla JavaScript and canvas, Firebase Realtime Database, Auth and Cloud Functions, and a Cloudflare Worker for the cleanup job. Runs within the free tier.

gg.sisamos.net

sisamos.net Live

My personal site and the entry point to these projects, with an animated background of falling Greek letters that form quotes.

White letters assembling out of dark falling letters into the line I know that I know nothing, with the New Rome book below.
A quote from Socrates forming from the falling letters.
A section titled The work on a glass panel with a wavy outline, its text, live counters of code written, and a Start with the plan button.
A content section on an animated glass panel, with live counters.

A hand-coded single page with a canvas animation of falling Greek letters that assemble into quotes from Greek philosophers and then fall apart. Section titles are drawn the same way, the New Rome audiobook plays with its text appearing in the animation word by word, and a paid project review, including file uploads, is sold directly on the page.

How it's built

The animation

All animation is drawn on canvas. A quote assembles letter by letter, holds, then breaks back into falling letters; section titles are drawn the same way on separate layers, up to three at once for fast scrolling. The tests count what is drawn in each frame, because these bugs are hard to see by eye but easy to measure.

Glass panels

Each section sits on a panel whose outline is a physics simulation: a closed ring of points connected by damped springs, with a 2.5 Hz natural frequency, heavily damped while the pointer is on it and lightly damped after release, so a touch propagates around the edge as a wave rather than a local dent. The background blur is clipped to the same outline.

The book

The New Rome cover animates from the header into its card with the Web Animations API. When the free chapter is playing, its words appear in the animation one at a time, spaced across each paragraph's duration in the recording.

The review

A written review of a project, bought on the page with Stripe's Payment Element and Express Checkout. The payment authorises the upload: the server confirms with Stripe that the payment has settled before issuing signed upload URLs, so no endpoint accepts files from anyone who has not paid. Without JavaScript, the same purchase works through a plain HTML form and a signed upload policy.

The statistics

A daily GitHub Actions job goes through five repositories, counts lines, comments, files and commits, checks which sites are up, and publishes the totals to the page.

Performance and testing

Frame times are measured on a real mid-range phone. With JavaScript blocked, the page falls back to a complete static version. Analytics are cookie-free, so no consent banner is needed. 32 test files, 21,256 lines.

Built with hand-written HTML, CSS and JavaScript, canvas and SVG, the Web Animations API, Firebase Hosting and Cloud Functions, Stripe Payment Element and Express Checkout, Cloud Storage signed URLs, and GitHub Actions.

sisamos.net

The studio Live

A crew of AI agents that work on my businesses every day, each named after a figure from Greek stories, in a building anyone can visit.

The Argo and Sympan rooms of the studio, each crew member at a desk with a name, a role and whether they are free.
The visitors' page: the crew at their desks, a knock on Argo's door, and Jason answering.
A visitor's message to Jason, the sales lead, and his answer: he looks for estate agencies that Argo could work for.
A visitor talking with Jason, the sales lead.

About twenty agents, each a scheduled Claude Code session with a written job: a chief of staff who reads every report each morning and puts the day's three most useful things at the top, builders and testers who open pull requests, scouts who prepare visits, and a review every Sunday that reads the whole week and opens one pull request to fix the crew itself. I run it from one private desk on my phone; anyone can visit the building, knock on a door and talk with whoever is free.

How it's built

The crew

Each crew member is a Claude Code routine: a schedule, a model chosen for the job (Opus, Sonnet or Haiku), a job description and a prompt kept in one repository, and only the tools the job needs. They report each run's start, progress and end to the desk, file what they need from me, and read the words I leave them at their next run.

The desk

One Cloud Function and Firestore behind a phone-first web app, paired to my devices with single-use codes. Every write passes a closed validator: an unknown field is refused, links must point to the studio's own sites, and each key writes only for its own crew and businesses. It sends at most one morning notification and three urgent ones a day.

The building

Drawn in SVG from code, the heroes in the manner of Greek vase painting, each seated in the pose of their state, with jointed arms so a change of pose moves through the joints instead of jumping. Anyone walking goes through doors, aisles and a lift, never through a wall.

Testing

242 tests, and 231 deliberately planted defects that the tests must catch before anything ships.

Built with Claude Code routines (Opus, Sonnet, Haiku), Firebase (Cloud Functions, Firestore, Hosting) in europe-west1, SVG and CSS animation, a Cloudflare Worker with a Durable Object and Workers AI, and web push.

Visit the studio

Why We Subscribe Live

MSc dissertation: why people subscribe, and why they stay.

The dissertation's title page on cream paper, with its second-edition line and an audio player set to the free first chapter.
The second edition, with the free first chapter in my cloned voice.
The end of the abstract and the contents: five chapters, each with its listening time, the first marked free.
The end of the abstract and the five chapters with their durations.

My MSc dissertation in digital marketing at the University of West London, How to Create Effective Marketing Strategies for Subscription-Based Businesses, revised and expanded in a 2026 second edition of 83 pages, with an audiobook in two voices: a clone of my own voice and a synthetic studio voice. The first chapter is free; the rest of the audiobook is fifteen euro.

How it's built

The study

A study of why people in Cyprus take up subscriptions and why they cancel them: an online questionnaire answered by 50 people in 2023, closed questions analysed descriptively and open ones thematically, ending in a four-stage framework and eleven recommendations. The second edition is revised and expanded throughout.

The voice

Chatterbox takes a voice's timbre from the first ten seconds of a reference recording, so the choice of those ten seconds matters more than the recording's length; the clip was chosen by listening as well as by similarity score. It runs locally on an RTX 4070 Ti at about nine seconds per chunk. Two jobs on the same GPU were measured at thirty minutes per chunk, so they never run together.

Payments and access

Unlocking converts a settled payment into an access grant stored where no browser can read it; the grant is exchanged for short-lived signed links, one file at a time. A lost grant can be restored from the buyer's email and the receipt reference, and refunds are detected within a day.

Release checks

Added after a renamed chapter was unavailable to paying listeners for about a day and a half: a pre-deploy check blocks any release whose manifest lists a chapter missing from storage, and a smoke test creates a real grant in production, downloads a file with it and deletes it.

Built with Chatterbox and Kokoro for the voices, one Cloud Function holding the entitlement, Cloud Storage and Cloudflare R2 behind signed links, and Stripe Payment Element.

research.sisamos.net

New Rome Live

A philosophical novel in dialogue, published and narrated one chapter at a time.

The list of the eleven chapters with Roman numerals, each with its place and its question; the first free to read, the next written and opening with the book.
The eleven chapters: seven written, the first free.
Chapter one, The Ground We Sit On, playing: an orange marker in the margin beside the paragraph being read, and the player bar at the foot.
Chapter one playing: a margin marker tracks the narration.

A philosophical novel in dialogue in the tradition of Plato's Republic: eleven conversations about what a just state would be, each set in a real place in Cyprus. Seven are written, in English and Greek (59,284 words), and all seven are narrated, read by the character Myrto in a voice cloned from my grandmother's. The first chapter is free; twelve euro buys the rest as they are published, plus the finished book.

How it's built

The chapters

The Ground We Sit On, above Kourion; Do Not Erase, in an empty primary-school classroom in Episkopi; The Line, at a National Guard post and on Ledra Street in Nicosia; Noise, in a server room in Limassol; The Ward, in a surgical ward at night; The Mountain of the Cross, at Stavrovouni; and The Tomb, at Tymvos Makedonitissas. Each chapter is built around one question, from "What is a citizen?" to "What may a just state ask a man to die for?"

The narration

Chatterbox again, generated locally one line at a time. Each Greek question is generated several times, and the take whose pitch falls at the end (questions with a question word) or rises (yes/no questions) is kept. Takes that hit the model's 40-second limit, are mostly silence, or stall mid-line are detected and regenerated.

Read-along

Audio timing is recorded against the exact paragraphs the build produces, so text and audio stay in sync. On the page, a marker beside the current paragraph grows as it is read, timed a sentence or two at a time, and a column of Roman numerals jumps to any section of the chapter.

Payments and access

Twelve euro, paid on the page by card or digital wallet. Each payment adds to the buyer's access grant, stored in a session cookie shared across sisamos.net's sites; a lost grant can be recovered by email or Google sign-in. Paid recordings are served through 30-minute signed links to Cloudflare R2; the free chapter is public.

The build

A Python build generates the whole site, the reader and the timing maps from the manuscript in both languages, without altering the text.

Built with Python, Chatterbox, Firebase Hosting, Cloud Functions for access, signed links and recovery, Stripe Payment Element and Express Checkout, and Cloudflare R2 (no egress fees).

newrome.sisamos.net

Working together

Fixed stages, a price and a date on each, agreed before anything begins.

It does not start with a meeting. Send me what you have, a brief, a specification, a folder of documents, a half-built product, and I read all of it and send back a written plan: the system I would build, in stages, with a price and a date on each stage, what I would cut, what it costs to run, and where it goes wrong. Three working days, one hundred and fifty euro, and it comes off the first invoice if we go on to build it.

The plan is yours either way. Take it to any developer, or to me.

sisamos.net/review chris@sisamos.net
sisamos.net