A 42 school project.
A lightweight prediction market designed to reduce the distortions introduced by money, while preserving incentives for truth-seeking and high-quality discussion.
# first time setup:
cp .env.example .env # fill in secrets
make gen-keys # Generate SSL cert + RSA key pair for JWT (run once)
# Start all services with hot-reload (docker-compose.override.yml picked up automatically)
make dev # docker compose up --build
# optional seed data for testing:
make seed # creates test users, bets, and commentsOpen https://localhost:8443 in your browser. Use the seeded test accounts or create a new one.
Money-driven prediction markets have structural flaws: complicated share buying mechanism and liquidity limitations; capital distorts signal, large players can influence outcomes, and disputes over resolution criteria turn toxic when real stakes are involved. Vox fixes this by making reputation the primary currency.
- Human-only participation: bots are not allowed.
- No real money (initially): users bet with platform-native points.
- Earned influence: points are earned through participation and contributions.
- Transparent resolution: outcomes are determined by a mix of automated data and community judgment.
- Yes / No – binary outcome.
- Multiple choice – pick one option from a set.
- Numeric – predict a number within a defined range.
Each position stakes between 1 and 10 BP.
- Probabilities – market probabilities are based on the number of active votes on each side, not the total BP staked. A larger stake increases your payout weight if you win, but it does not move the displayed probability on its own.
- Withdrawal – a bet can be withdrawn at any time before resolution, but only part of the stake is refunded, depending on the actual winning probability at the time of withdrawal.
- Winning – when a market resolves, the total pot is distributed among the winning side. Winners are paid in proportion to their BP-s staked on the correct outcome (max 10x return).
- Truth Points – winning also grants TP, based on how long you spent in the correct position during the lifetime of the market. Getting in early and staying right counts more than switching late.
| Currency | Name | How You Earn It | Purpose |
|---|---|---|---|
| ❤️ | Like Points | New upvotes on your comments or proposed markets (converted to BP on login) | Measures community contribution |
| BP | Betting Points | +10 at signup, +1 daily login, +log2(❤️+1) but max 10 | Currency for placing bets |
| TP | Truth Points | for each winning bet: + (twin / tbet) | Tracks forecasting accuracy |
| SP | Spice Points | Winnings from pairwise real-money bets (coming soon) | Skin-in-the-game signal |
- LP balance changes are pushed in real time to the recipient's open sessions when their comments or markets are liked/unliked
- the flat bet cap of max 10 BP prevents any single user from dominating a market regardless of balance
- the TP amount twin / tbet is the ratio of time in winning position over the total time of the bet (reduces last minute TP farming)
Every bet doubles as a discussion thread. Anyone can propose a bet and define its terms. Resolution works in three tiers:
- Automatic – pulled from public APIs/data sources (open-meteo in current implementation).
- Bet Proposer – if the outcome is clear-cut, the proposer can resolve it unilaterally.
- Community vote – if proposer outcome is disputed, a weighted majority vote determines the final resolution.
- disputing a bet costs 1 BP and a losing dispute costs an additional 1 BP, while a successful dispute rewards 2 BP to the disputing voters
- at least 10% of the losing participants must vote to trigger a dispute
- vote weight:
- 0.5x for users voting for their winning position
- 2x for users voting against their own position
- 1x for users who didn't participate in the bet
- bet proposers wrongly resolving a bet lose half of their staked BP as a penalty (including eventual winning on ongoing bets)
Humans only. No bots, no automation. Participation earns points; points unlock larger positions.
Once the platform reaches critical mass (~10k users), optional real-money micro-bets become available:
- Pairwise bets between two users within an existing thread. Each party stakes between 1 and 99 cents so the pot always totals €1. The winner takes the full euro.
- Pairwise bets cannot be withdrawn.
- A pairwise bet resolves when both parties agree on the outcome.
- The aggregate of settled pairwise bets produces a spice flavour that can factor into disputed thread-level resolutions.
- Spice points are docked for users who resist accepting clear outcomes.
- Only enabled in jurisdictions where gambling is legal.
| Choice | |
|---|---|
| Frontend | Next.js 15 (React 19) + TypeScript + Tailwind CSS 4 |
| Backend | FastAPI (Python 3.12) + SQLAlchemy 2 + Alembic |
| Database | PostgreSQL 16 + Redis 7 |
| Real-time | Socket.IO (WebSockets) |
| Auth | JWT + bcrypt + OAuth 2.0 |
| LLM | OpenRouter API (thread summarizer, resolution assistant) |
| Infra | Docker Compose + Nginx (HTTPS) |
See plan/TECH.md for module targets and plan/PLANNING.md for the full project plan (architecture, database schema, API endpoints, deployment).
Vox Populi rewards being right over being rich. Reputation is earned, bets are transparent, and the community – not capital – decides what's true.