Inspiration
The idea came from a frustration most creators know well: your audience is the most passionate, opinionated group of people about your work and they have absolutely no say in it.
YouTube comment sections are full of people saying "the story should have gone this way." Twitch chat tries to dictate what the streamer does next. The desire to collaborate in creative spaces is everywhere.
We also noticed something wrong about how loyalty works online. A superfan and a casual follower get the exact same experience. There's no way for a creator to say "you've been here from the start so you get to help in what comes next." Storii is that mechanism.
Real comments are hidden under the bot spam. Real criticism is censored by the platform or the content creator. A decentralized platform solves these problems.
The final piece was Solana. When you have a network that settles transactions in 400ms for fractions of a cent, a live voting experience with thousands of participants becomes technically feasible for the first time. The platform we wanted to build genuinely couldn't have existed before.
What we built
Storii is a collaborative writing platform where creators and their privileged subscribers co-author content paragraph by paragraph, with every vote and winning contribution permanently sealed on Solana.
The process is simple:
- A creator writes an opening paragraph and opens a round
- Inner circle subscribers submit candidate paragraphs
- The community votes live, in real time
- The winning paragraph is sealed on-chain forever, attributed to the contributor's wallet
- Repeat until the piece is complete
The reward for contributors is a permanent co-author credit on the chain, and the satisfaction contributing to their favorite creators and community.
How we built it
The stack has three layers that talk to each other in real time.
Smart contracts (Anchor / Rust) handle everything that needs to be trustless: piece state, subscriber tiers, token issuance, submissions, votes, and round resolution. The core insight was using a Program Derived Address seeded from [round_id, voter_wallet] to enforce one vote per wallet at the protocol level. No backend can override it, it's permanently part of the chain.
Votes are counted on-chain. When a round closes, the contract determines the winner by highest vote count and writes the result with the contributor's wallet address and a SHA-256 hash of the paragraph text. The full text lives on Arweave, and the hash being on-chain means anyone can verify it hasn't been tampered with.
winner = argmax over all s in submissions of votes(s)
The backend (Node.js) bridges the gap between the chain and the user experience. It handles Arweave uploads, serves paragraph content, manages the submission blinding logic (you can't see other entries until you've submitted your own), and runs a cron job that watches round deadlines and calls close_round automatically. Critically, it subscribes to Solana program account changes via websocket and pipes vote updates to the frontend in real time via Socket.io.
The frontend (React) was built around one principle: blockchain should be invisible. A subscriber sees "Submit your paragraph" — not "sign a transaction." A voter sees a live bar chart updating as votes pour in — not a transaction hash. The only moment the wallet is visible is the connection step, and even that is framed as "join the story."
Challenges we faced
The submission blinding problem was harder than expected. We wanted contributors to write without peeking at other submissions before committing. On a public blockchain, all account data is readable, which means a user could query the program directly and see other submissions before voting. Our solution was to encrypt content with the specific round's public key on upload, waiting to decrypt only after the submission window closes. The hash committed on-chain is encrypted, decryption happens after the deadline.
Another problem is that token airdrop timing limited our progress. When a creator opens a round, the contract needs to airdrop tokens to potentially hundreds of wallets simultaneously. Doing this as individual transactions was too slow and too expensive. We batched token transfers using Solana's transaction size limit (1232 bytes) and processed them in parallel, bringing the airdrop time for 500 wallets from ~40 seconds down to under 3 seconds.
For tiebreaking, the contract awards the win to whichever was submitted first. This keeps the outcome fair and removes any creator bias from the result, which was important to keep trust with our users.
Making it feel non-crypto was our biggest goal. We wrapped every interaction in plain language, hid all addresses behind display names where possible, and replaced every error code with a simple readable message. The goal was that a user who has never heard of Solana could participate in a writing round without noticing they were using a blockchain.
What we learned
Solana's speed makes products possible. A live vote with thousands of participants that updates in real time and settles permanently isn't just a faster version of something that existed before. We believe it’s a new thing only possible through Salana.
We also learned that the most important technical decision was something we didn’t even add. We choose not to make tokens financial instruments. Every time we considered adding staking, rewards, or tradeable tokens, the product got more complex, which is unappealing for nontechnical users.
What's next
- Mobile app — the voting experience is inherently mobile. A native app with push notifications when a new round opens would dramatically improve engagement.
- Creator analytics — which subscribers are most active, which rounds get the most submissions, how vote distributions shift over time.
- Mainnet launch — the architecture is production-ready. The step to mainnet is configuration and finalizing engineering.
Built With
- anchor
- and
- arweave
- express.js
- google-gemini-api
- node.js
- npm
- react
- rust
- socket.io
- solana
- solana-wallet-adapter
- tailwind-css
- temp
- typescript
- vite
Log in or sign up for Devpost to join the conversation.