Score-based competitive markets on Starknet. Factory Owners stake on game scores, Challengers pay to beat them, Vault Investors provide capital. Built by RuneLabs.
Midgard turns game scores into competitive markets. Factory Owners select a game, set a score target, and stake capital. Challengers buy ticket attempts to beat the score: losses feed the factory, wins pay out to the challenger. Vault Investors supply capital and earn lending returns. Seasonal prize pools reward top performers.
Live at midgard.game, docs at docs.midgard.game, beta at beta.midgard.game. Built by RuneLabs (same team as PonziLand).

Full-stack dev plus art direction across code, 3D, and brand:
Balancing Factory Owners, Challengers, and Vault Investors so every role has positive expected value in some market condition. Stake sizing, ticket pricing, and vault yield all interact; onchain math has to stay consistent with UI-visible odds.
Scores come from mini-games played in-app. Preventing score forgery while keeping the UX snappy required signed session proofs and server-side replay checks before any onchain settlement.
Migrating from Svelte 4 stores to $state / $derived / $effect. Reactivity is more explicit but needs discipline to avoid cross-component effect storms.
Factories, stakes, and vault positions live onchain; game sessions and matchmaking live offchain. Event-driven sync via Torii keeps both sides consistent; reorg handling and timeout expiry are the hard edges.
The Midgard wordmark pairs a chunky, slightly-beveled sans with a stylized “M” glyph echoing a factory silhouette: two stacks, a tapered roofline. Goal: read as industrial / mercantile without falling into crypto-tech clichés (no gradients, no circuit lines). Flat fills, high contrast, one accent color so the mark survives on busy game backdrops and small favicon sizes alike.

The header art uses the isometric factory as the anchor, with the wordmark locked to a consistent baseline. Beta banner variants reuse the same factory render so cross-surface recognition stays tight.

Every hero visual on the site and in-app comes from a single Blender scene. One source of truth means silhouettes, materials, and lighting stay consistent across the landing page, app banners, marketing, and in-world 3D.


The in-app 3D view is built on Three.js via Threlte (Svelte bindings for Three.js), so 3D components compose like any other Svelte 5 component and share the same $state/$derived reactivity.
Pipeline:
<GLTF> loader in Threlte, instanced meshes for repeated parcels/propsWhy Three.js over a pre-rendered image loop: factories need to reflect live onchain state (stakes, tenants, score trends). Live 3D ties visual feedback directly to the game economy instead of faking it with sprite swaps.