Inspiration

Inscribi Director explores a simple interaction: let an audience decide what happens next in a live AI video. A phone becomes a voting interface, the result is recorded on Monad testnet, and the winning option becomes a direction for the stage video.

The interesting engineering problem is coordinating three different timelines: a voting round, an external generation service and video already buffered in the stage browser. The audience should be able to distinguish a winning choice from the moment its video actually appears.

What it does

The audience joins from a QR code, receives demo testnet MON and chooses among four options. The contract permits one paid testnet vote per address per round. When voting ends, the server finalizes the round and associates its winner with a versioned prompt.

The stage browser sends that prompt to the live Director session and relays provider messages to the server. A matching video-chunk report lets the application track when the new output is expected to reach the display. The operator can stop the show, cancel a round or abandon an unanswered direction. Cancelled rounds support a refund flow.

This is a prototype using Monad testnet. Testnet MON is not real money. The live video provider is a separate, potentially paid dependency; opening a real generation session is different from inspecting the project or running its local rehearsal.

How it is built

The contract defines four choices, an option hash, a deadline, an exact vote fee and round accounting. The server reads chain state, coordinates the show and maps a winning option to the corresponding prompt. The browser owns the live video connection over WebRTC.

The bridge persists a direction before the stage can consume it. Each record keeps the round, selected choice, prompt and prompt version. Repeated processing of the same round returns the saved entry, and an unresolved direction blocks the next one. A missing acknowledgement does not automatically trigger another generation command.

A separate session manager tracks the stage owner, provider-session claim, attempts, duration and budget. The application ends a persisted live session as interrupted after a restart, rather than silently opening another paid session. Provider credentials and operator credentials remain server-side in the intended deployment.

The implementation uses JavaScript on Node.js, Solidity, viem, Foundry, Monad testnet and the fal Director integration. A documented local rehearsal starts an Anvil chain and uses a fake video provider. That mode exercises the application flow without generating video; it must not be presented as a live model demonstration.

Challenges addressed

An unanswered request has an unknown outcome. The bridge therefore distinguishes waiting, applied, rejected and abandoned directions. Provider acceptance and reported video presentation are tracked separately, and late acknowledgements do not rewrite terminal decisions.

Another boundary is session recovery. Restarting an application must not imply permission to resume paid external activity. Session state, budget accounting and stage heartbeats make that behavior explicit. Local accounting still needs to be reconciled with the provider’s actual lifecycle and final billing.

Implemented accomplishments

The public repository contains the contract, audience and stage interfaces, operator controls, vote-to-prompt bridge, refund flow and local rehearsal tooling. It also contains unit, contract and end-to-end test definitions. Their presence describes the verification design; this project text does not claim a fresh live-event benchmark or a newly completed test run.

42 İstanbul Blockchain TR’s public event report records Inscribi Director’s third-place team result at Monad Blitz Istanbul. This is a team result, with Dilanur Nigar, Kaan Demir and Yakup Gündüz named in the report.

The architecture has a clear operating boundary: one process on one server. Horizontal scaling is not implemented, and the stage browser’s connection is a dependency of the live experience.

Engineering lessons

A finalized vote, an accepted prompt and a displayed video chunk are different facts. Giving each a separate representation makes the interface and failure recovery more understandable.

Likewise, local duplicate handling does not prove exactly-once execution across an external provider. An explicit uncertain state is often more honest and operationally useful than an automatic retry that hides a possible duplicate effect.

What is next

Proposed next work is to strengthen provider reconciliation, record structured outcomes for interrupted sessions and expand failure-injection rehearsals around delayed chunks, lost replies and browser disconnection. Any move beyond one server would also require a deliberate shared-state and ownership design.

Team roles

Kaan Demir’s work covered the Monad smart contract, payment and refund flow, round state, winning-vote bridge, proxy and cost control. Yakup Gündüz designed the stage interface. These roles are recorded in the public repository and project page.

Dilanur Nigar is also listed as a team member in the event report.

Source and project links

This description was prepared with AI assistance from the linked project evidence.

Built With

Share this project:

Updates