STREAK β Technical & Design Specification A Trustless Commitment Contract Platform on NEAR
Version: 1.0 Date: February 27, 2026 Company: MontaQ Labs Product Type: Mobile-first PWA (Progressive Web App)
- App:
streak-app/β Next.js 16 PWA, NEAR Wallet Selector (modal-ui), black/lime design. - Contract: v1.1.0 β single monthly pool (28 days), anyone can
start_pool/distribute, daily check-in with 25h grace, mid-pool join with scaled rewards, optional on-chain goal when joining, 20% protocol fee. - Testnet contract:
streak-v2b-1772382282.testnetβ see streak-app/README.md for setup and streak-app/contract/AUDIT.md for the security audit. - Deployed app (e.g. Vercel): Uses an in-app RPC proxy (
/api/near-rpc) so the browser does not hit NEAR RPC directly (avoids CORS). See streak-app README βDeployment and CORSβ.
Executive Summary Streak is a blockchain-based commitment platform where users stake crypto on personal goals (fitness, habits, productivity). Smart contracts enforce accountability β succeed and reclaim your stake plus share of losers' pool, fail and forfeit to winners. NEAR Intents enables payment in any token from any chain (SOL, ETH, BTC, USDC, etc.) while settlement happens on NEAR.
Core Value Prop: Financial skin in the game + social accountability = the most effective behavior change tool ever built.
Business Model: 20% of all forfeited stakes flows to protocol. Zero servers after deployment. Pure smart contract revenue.
Product Architecture Tech Stack text Frontend Layer: ββ Next.js 15 (App Router, React 19) ββ TypeScript (type safety) ββ Tailwind CSS (utility-first styling) ββ Framer Motion (animations) ββ PWA manifest + service worker (offline support, install prompt) ββ Vercel deployment (edge functions)
Wallet Integration: ββ NEAR Wallet Selector (social login + web wallets) ββ WalletConnect v2 (multi-chain support) ββ NEAR Intents SDK (cross-chain token routing)
Smart Contract: ββ Rust (near-sdk-rs v5) ββ Deployed on NEAR Protocol ββ Audited by MontaQ internal security team ββ Upgradeable proxy pattern (security patches)
Backend Services (minimal): ββ Cloudflare Workers (API layer for intent routing) ββ Supabase (user profiles, goal templates, social feed) ββ NEAR RPC (chain queries)
Analytics & Monitoring: ββ PostHog (privacy-first product analytics) ββ Sentry (error tracking) ββ NEAR Indexer (on-chain event monitoring) Why PWA instead of native:
Single codebase for iOS, Android, desktop, web [web:676][web:681]
Instant updates (no app store review delay)
Zero install friction (add to homescreen = installed)
Lower maintenance cost
NEAR Intents works identically across all platforms
Why Next.js:
Built-in PWA support via next-pwa [web:681][web:682]
Server-side rendering improves initial load time (critical for mobile) [web:681]
Edge API routes for intent settlement
Industry standard for high-performance React apps [web:678]
Smart Contract Design Core Contract: streak.near State Structure:
rust pub struct Commitment { user: AccountId, goal_text: String, stake_amount: Balance, stake_token: TokenId, // e.g., "NEAR", "SOL", "USDC" original_chain: ChainId, // for NEAR Intents payout routing verifier: AccountId, start_date: Timestamp, duration_days: u32, check_ins: Vec, status: CommitmentStatus, // Active | Completed | Failed pool_id: PoolId, // which shared pool this joins }
pub struct Pool { goal_category: String, // "fitness", "diet", "productivity" total_staked: Balance, participants: Vec, start_date: Timestamp, end_date: Timestamp, privacy: PoolPrivacy, // Public | Confidential (uses NEAR Confidential Intents) } Key Methods:
commit(goal, stake, token, duration, verifier, pool_id)
User creates a commitment and stakes tokens
NEAR Intents handles cross-chain deposit
Joins specified pool or creates new one
Emits CommitmentCreated event
check_in()
User confirms daily/weekly progress
Updates check_ins array
Verifier can override if user lies (slashing mechanism)
Emits CheckInRecorded event
verify(commitment_id, approved: bool)
Verifier approves or rejects check-in
If rejected, commitment fails immediately
Verifier stake at risk for false rejections (accountability)
settle(commitment_id)
Called after duration ends
Success: returns stake + proportional share of pool's forfeited funds
Failure: 80% to winners pool, 20% to protocol treasury
Payouts routed via NEAR Intents to original chain [web:656][web:659]
withdraw_winnings()
Winners claim their share manually (push payment anti-pattern avoided)
Gas-efficient batch withdrawals
Security Features:
Reentrancy guards on all fund transfers
Rate limiting on commitment creation (anti-spam)
Emergency pause mechanism (multisig controlled)
Verifier staking (verifiers must stake 10% of commitment value to verify)
NEAR Intents Integration How Multi-Chain Works:
text User Flow (Solana Example):
- User connects Phantom wallet on streak.app
- Clicks "Commit 0.5 SOL to 30-day streak"
- Frontend generates NEAR Intent: { "from_chain": "solana", "from_token": "SOL", "from_amount": "0.5", "to_chain": "near", "to_contract": "streak.near", "to_method": "commit", "to_args": { goal: "...", duration: 30, ... } }
- NEAR Intents solver picks up intent
- SOL converted β deposited to streak.near contract
- Commitment is live on NEAR
- On success: payout routed back to Solana as SOL Supported Chains via NEAR Intents: Bitcoin, Ethereum, Solana, Polygon, Arbitrum, Base, TRON, Cardano, Dogecoin, Avalanche, BNB Chain, and 25+ more [web:654][web:656]
Privacy Option: Confidential Intents (launched Feb 25, 2026) allow hidden stake amounts β nobody on-chain sees you bet $500 on your diet [web:657].
Integration Library: SwapKit NEAR Intents SDK [web:666] β TypeScript-first, handles routing/settlement automatically.
Design System Design Philosophy Gen Z aesthetic meets financial seriousness. High contrast, bold typography, hyper-saturated accent colors [web:669][web:670]. No pastels. No corporate blue. This is money on the line β the design should feel that way.
Inspiration:
Robinhood (bold CTAs, gamified progress)
Duolingo (streak anxiety, loss aversion)
Cash App (personality + trust)
Core Principles:
Brutally honest feedback β if you're failing, the UI tells you
Progress obsession β every screen shows your streak count prominently
Social pressure β see who else is succeeding/failing
Mobile-first β 90% of usage will be on mobile
Dark mode default β reduces eye strain, increases perceived value [web:669]
Color Palette Primary Colors:
Role Name HEX RGB Usage Background True Black #000000 0, 0, 0 App background Surface Obsidian #0F0F0F 15, 15, 15 Cards, modals Surface Elevated Charcoal #1A1A1A 26, 26, 26 Raised elements Accent Primary Electric Lime #CCFF00 204, 255, 0 CTAs, success states, active streaks Accent Danger Neon Red #FF0055 255, 0, 85 Failure warnings, forfeit UI Accent Info Cyan Glow #00F0FF 0, 240, 255 Neutral actions, info badges Why these specific colors:
Electric Lime β hyper-saturated, Gen Z-coded, screams "energy and progress" [web:669][web:670]
Neon Red β aggressive, impossible to ignore, triggers loss aversion
True Black β high contrast with neon accents, modern, premium feel [web:669]
Text Colors:
Role HEX Usage Primary Text #FFFFFF Headlines, key data Secondary Text #A0A0A0 Body text, metadata Tertiary Text #606060 Timestamps, hints Error Text #FF0055 Warnings, failure messages Success Text #CCFF00 Completion messages Status Colors:
State Color HEX Usage Active Streak Electric Lime #CCFF00 Currently on track At Risk Neon Orange #FF6B00 Missed 1 check-in, grace period Failed Neon Red #FF0055 Commitment broken Completed Cyan Glow #00F0FF Streak finished successfully Pending Slate Gray #4A4A4A Awaiting verifier approval Gradients (use sparingly):
css /* Hero gradient (main CTA button) */ .gradient-primary { background: linear-gradient(135deg, #CCFF00 0%, #00F0FF 100%); }
/* Danger gradient (forfeit warning) */ .gradient-danger { background: linear-gradient(135deg, #FF0055 0%, #FF6B00 100%); }
/* Success shimmer (streak milestone reached) */ .gradient-success { background: linear-gradient(90deg, #CCFF00 0%, #FFFFFF 50%, #CCFF00 100% ); background-size: 200% auto; animation: shimmer 2s linear infinite; } Typography Primary Font: Satoshi (Variable) Modern, geometric, high x-height (better mobile readability), Gen Z-friendly [web:670][web:672]. Fallback: Inter, system-ui
Monospace Font: JetBrains Mono For wallet addresses, transaction hashes, countdown timers.
Type Scale:
Style Font Size (Mobile) Weight Line Height Usage Display Satoshi 40px 900 Black 1.1 Streak count (hero number) Heading 1 Satoshi 28px 700 Bold 1.2 Screen titles Heading 2 Satoshi 22px 700 Bold 1.3 Section headers Heading 3 Satoshi 18px 600 SemiBold 1.3 Card titles Body Large Satoshi 16px 500 Medium 1.5 Goal descriptions Body Satoshi 14px 400 Regular 1.5 Standard text Caption Satoshi 12px 500 Medium 1.4 Metadata, badges Label Satoshi 11px 600 SemiBold 1.3 Button labels (uppercase) Mono JetBrains Mono 13px 400 Regular 1.4 Addresses, hashes Desktop adjustments: Scale up by 1.2x for screens >768px width.
Responsive font sizing:
css /* Using clamp for fluid typography */ h1 { font-size: clamp(28px, 5vw, 40px); } body { font-size: clamp(14px, 2vw, 16px); } Spacing & Layout Base Unit: 4px (everything is a multiple of 4)
Spacing Scale:
text 4px β micro (icon gaps) 8px β xs (tight padding) 12px β sm (compact elements) 16px β base (standard padding) 24px β md (section spacing) 32px β lg (card margins) 48px β xl (screen top padding) 64px β 2xl (hero section) Layout Grid:
Mobile: 16px side gutters, 8px column gap
Tablet/Desktop: 24px side gutters, 16px column gap
Max content width: 640px (single-column focus)
Safe Areas:
iOS: respect env(safe-area-inset-*) for notch/home bar
Android: handle gesture navigation bar spacing
Component Design
- Main CTA Button text Style: Filled gradient with slight 3D lift Background: gradient-primary (#CCFF00 β #00F0FF) Text: #000000 (black for max contrast) Satoshi 700 Bold 16px uppercase Height: 56px (thumb-friendly) Border radius: 12px Shadow: 0 4px 12px rgba(204, 255, 0, 0.4) Hover/Press: scale(0.98) + brightness(1.1)
Example: ββββββββββββββββββββββββββββββββββββββ β START YOUR STREAK β β Electric lime β cyan gradient ββββββββββββββββββββββββββββββββββββββ 2. Secondary Button text Style: Outlined ghost button Background: transparent Border: 2px solid #CCFF00 Text: #CCFF00 Satoshi 600 SemiBold 16px uppercase Height: 56px Border radius: 12px Hover: background #CCFF00 10% opacity
Example: ββββββββββββββββββββββββββββββββββββββ β VIEW LEADERBOARD β β Lime border, transparent fill ββββββββββββββββββββββββββββββββββββββ 3. Danger Button (Forfeit Warning) text Background: gradient-danger (#FF0055 β #FF6B00) Text: #FFFFFF Satoshi 700 Bold 14px uppercase Height: 48px Border radius: 10px Shadow: 0 4px 12px rgba(255, 0, 85, 0.5) Pulsing animation: opacity 1.0 β 0.8 (1s loop) when active
Example: ββββββββββββββββββββββββββββββββββββββ β β FORFEIT STAKE ($50) β β Red gradient, pulsing ββββββββββββββββββββββββββββββββββββββ 4. Commitment Card text Background: #0F0F0F (Obsidian) Border: 1px solid #1A1A1A Border radius: 16px Padding: 20px Shadow: 0 2px 8px rgba(0, 0, 0, 0.4)
Layout: βββββββββββββββββββββββββββββββββββββββββββ β π₯ 12 DAY STREAK [ACTIVE] β β Status badge (lime) β β β No junk food for 30 days β β Goal text (18px bold white) β 0.5 SOL staked Β· $67.20 β β Stake info (14px gray) β β β βββββββββββββββββββββββββ 18/30 days β β Progress bar (lime fill) β β β Next check-in: in 8 hours β β Countdown (12px cyan) β β β βββββββββββββββββββββββββββββββββββββ β β Verified by: @alice.near β β β Verifier (12px gray) βββββββββββββββββββββββββββββββββββββββββββ Interaction: Tap card β opens detail modal with full history, verifier chat, early forfeit option.
- Progress Bar text Container:
- Background: #1A1A1A
- Height: 8px
- Border radius: 4px
- Full width
Fill:
- Background: #CCFF00 (active) or #FF0055 (at risk)
- Smooth CSS transition: width 0.6s cubic-bezier(0.16, 1, 0.3, 1)
- Glow effect: box-shadow 0 0 8px currentColor
Milestone markers (10, 20, 30 days):
- Small diamonds at specific percentages
- Color: #00F0FF
- Check-In Button text Floating Action Button (FAB) style Position: Fixed bottom-right, 24px from edges Size: 64px diameter Background: gradient-primary Icon: β checkmark (32px white) Shadow: 0 6px 20px rgba(204, 255, 0, 0.6) Animation: gentle pulse (scale 1.0 β 1.05, 2s loop)
Only visible when check-in is due. Tap: triggers confetti animation + haptic feedback 7. Streak Counter (Hero Number) text Typography: Satoshi Black 72px (mobile), 120px (desktop) Color: #CCFF00 Animation: count-up on mount (0 β actual number, 1.5s) Glow: text-shadow 0 0 20px rgba(204, 255, 0, 0.8)
Layout: π₯ 142 β Neon lime, enormous DAY STREAK β Small caps, 14px gray
Centered on dashboard hero section. 8. Leaderboard Row text Background: #0F0F0F Border-bottom: 1px solid #1A1A1A Padding: 16px Height: 72px
Layout: ββββββββββββββββββββββββββββββββββββββββ β #1 π€ @bob.near π₯ 89 days β β 10 SOL staked β ββββββββββββββββββββββββββββββββββββββββ β β β Rank Username Streak (lime) Top 3 special styling:
#1: Gold gradient border
#2: Silver gray border
#3: Bronze orange border
- Modal / Bottom Sheet text For mobile: slide up from bottom (native feel) For desktop: centered modal with backdrop blur
Background: #0F0F0F Border radius: 24px 24px 0 0 (mobile) / 20px (desktop) Backdrop: rgba(0, 0, 0, 0.7) with blur(10px) [web:673] Animation: slide-up 0.3s cubic-bezier + backdrop fade-in
Header:
- Drag handle (mobile): 32px wide, 4px tall, #606060, centered top
- Close button (desktop): X icon top-right
Max height: 85vh (mobile), 600px (desktop) Scrollable content if overflow 10. Status Badge text Small pill-shaped indicators
Active:
- Background: rgba(204, 255, 0, 0.15)
- Border: 1px solid #CCFF00
- Text: #CCFF00 Satoshi 600 SemiBold 11px uppercase
At Risk:
- Background: rgba(255, 107, 0, 0.15)
- Border: 1px solid #FF6B00
- Text: #FF6B00
Failed:
- Background: rgba(255, 0, 85, 0.15)
- Border: 1px solid #FF0055
- Text: #FF0055
Completed:
- Background: rgba(0, 240, 255, 0.15)
- Border: 1px solid #00F0FF
- Text: #00F0FF
Height: 24px Padding: 4px 10px Border radius: 12px Iconography System: Phosphor Icons (Duotone style) Size: 24px (standard), 20px (compact), 32px (hero) Color: Matches text hierarchy (#FFFFFF primary, #A0A0A0 secondary)
Key Icons:
π₯ Fire: Active streaks
β Check: Successful check-ins
β Warning: At-risk status
π° Money bag: Stake amounts
π€ User: Profile/verifier
π Chart: Leaderboard/stats
βοΈ Gear: Settings
π Bell: Notifications
β Plus: Create new commitment
π Trophy: Milestones
Custom illustrations: Minimal 3D style for empty states, onboarding β think Spline exports (WebGL micro-interactions).
Animations & Micro-interactions Performance budget: 60fps mandatory. Use GPU-accelerated properties only (transform, opacity).
Key Animations:
- Check-In Success:
text User taps check-in button β Haptic feedback (medium impact) β Confetti explosion (lottie animation, 1.5s) β +1 counter animation on streak number β Progress bar smooth fill extension β Success toast: "Day 13 complete! π₯" 2. Streak Milestone (10, 20, 30 days):
text Progress bar hits milestone β Screen flashes lime (#CCFF00 overlay, 0.2s) β Firework animation (lottie, 2s) β Trophy icon drops from top (bounce easing) β Sound effect (optional, user preference) 3. Commitment Failure:
text Deadline passes without check-in β Screen slowly saturates to red tint (2s) β All lime accents turn red β "Streak Broken" modal slides up with forfeit details β Sad trombone sound (optional) 4. Leaderboard Position Change:
text Your rank improves β Your row pulses lime glow (0.5s) β Slides up to new position (0.8s ease-out) β Confetti if you enter top 3 5. Loading States:
text Smart contract transactions β Skeleton screens (no spinners β feels faster) β Pulse animation on skeleton (1.5s loop) β Lime accent bar slides across top (indeterminate progress) 6. Page Transitions:
text Route changes β Current view fades out (0.2s) β New view slides in from right (0.3s, 20px offset) β Overlapping timing (feels snappier than sequential) Libraries:
Framer Motion (React animations)
Lottie (complex illustrations like confetti)
GSAP (timeline-based sequences if needed)
Responsive Breakpoints text Mobile: 320px β 767px (primary target) Tablet: 768px β 1023px Desktop: 1024px+
Design mobile-first, enhance for larger screens. Never hide features on mobile β optimize layout instead. Mobile-specific UX:
Bottom tab navigation (5 tabs max)
Swipe gestures for card actions (swipe left = forfeit, swipe right = details)
Pull-to-refresh on feed
Native-style modals (slide from bottom)
Thumb-zone optimization (CTAs in bottom 2/3 of screen)
Desktop enhancements:
Two-column layout (feed on left, stats sidebar on right)
Hover states on all interactive elements
Keyboard shortcuts (? for help modal, N for new commitment)
Persistent navigation sidebar
User Flows Flow 1: Create First Commitment text
-
Landing Page β User sees hero: "Put money on the line. Change your life." β CTA: "START YOUR STREAK" (lime gradient button)
-
Connect Wallet Modal β Choose wallet: NEAR, Metamask, Phantom, etc. (WalletConnect) β One-click social login option (NEAR wallet selector)
-
Onboarding Swiper (3 screens) β Screen 1: "How it works β Commit, Verify, Win or Lose" β Screen 2: "Choose any token from any chain β we handle routing" β Screen 3: "Invite a friend as your verifier for accountability" β CTA: "GOT IT"
-
Create Commitment Form β Field 1: Goal text (placeholder: "Exercise every day for 30 days") β Field 2: Duration (selector: 7 / 14 / 30 / 60 / 90 days) β Field 3: Stake amount (input + token dropdown) β Field 4: Verifier (search username or paste address) β Field 5: Pool privacy (toggle: Public / Confidential) β Preview card shows: stake amount in USD, daily check-in requirement β CTA: "COMMIT & STAKE" (shows loading state during tx)
-
Transaction Confirmation β Wallet prompts signature β NEAR Intents processes cross-chain deposit (10-30s) β Success screen: "You're in! π₯ Day 1 starts now" β CTA: "VIEW MY STREAK"
-
Dashboard β Hero shows: Day 1 streak counter β Card shows: Active commitment with countdown to next check-in β FAB visible: "CHECK IN" (pulsing, lime) Flow 2: Daily Check-In text
-
User opens app (push notification reminder sent 1hr before deadline)
-
Dashboard shows: "Check-in due in 47 minutes" (countdown, orange warning)
-
User taps FAB: "CHECK IN"
-
Modal appears: β "Confirm your progress today" β Optional: Add photo or note (social feed sharing) β CTA: "CONFIRM CHECK-IN"
-
Success animation (confetti + haptic)
-
Streak counter animates: 1 β 2
-
Toast: "Day 2 complete! π₯ 28 days to go"
-
Verifier gets notification: "@username checked in β approve?" Flow 3: Commitment Completion text
-
Final day check-in submitted
-
Verifier approves within 24hr grace period
-
Smart contract settles: β User succeeded β calculates winnings share β Contract triggers payout via NEAR Intents
-
Success modal: β "30 DAYS COMPLETE! π" β Shows: Original stake + winnings (e.g., "0.5 SOL β 0.68 SOL") β Stats: "You outlasted 67% of participants" β CTA: "CLAIM WINNINGS" (one tap, gas fee paid from winnings)
-
Celebration animation (fireworks, 3s)
-
Trophy badge added to profile
-
Share card generated: β Beautiful image: "I completed a 30-day streak on Streak" β CTAs: Share to Twitter, Instagram story, etc. Flow 4: Commitment Failure text
-
Deadline passes without check-in
-
Smart contract marks commitment as failed
-
Push notification: "Your streak is broken π"
-
User opens app
-
Screen tints red
-
Modal appears: β "Streak Broken" β Shows: Days completed (e.g., "Made it 12/30 days") β Forfeit amount: "0.5 SOL forfeited" β Breakdown: "0.4 SOL to winners, 0.1 SOL to protocol" β Encouragement: "Try again? 80% of people who restart succeed" β CTA: "START NEW STREAK"
-
Failed commitment moves to "Past Streaks" (grayed out)
-
Verifier earns verification fee (0.01 NEAR per verified commitment) Key Screens (Wireframe Descriptions) Screen 1: Landing / Hero text βββββββββββββββββββββββββββββββββββββββββββββββ β β β β β π₯ STREAK β β Logo (lime) β β β β β Put money on the line. β β H1 (white, 32px) β Change your life. β β β β Commit to your goals. Stake crypto. β β Body (gray) β Succeed and win. Fail and forfeit. β β β β βββββββββββββββββββββββββββββββββββββ β β β START YOUR STREAK π₯ β β β CTA (gradient) β βββββββββββββββββββββββββββββββββββββ β β β β Any token. Any chain. Trustless. β β Caption (cyan) β Powered by NEAR Intents β β β β βββββββββββββββββββββββββββββββββββββ β β β β Live Stats: β β Social proof β β’ 1,247 active streaks β β β’ $89,432 currently staked β β β’ 67% success rate β β β β βββββββββββββββββββββββββββββββββββββ β β β β How it works (3 cards: Commit, Verify, β β Win/Lose) with icons and short text β β β β βββββββββββββββββββββββββββββββββββββ β β β CONNECT WALLET β β β Secondary CTA β βββββββββββββββββββββββββββββββββββββ β β β βββββββββββββββββββββββββββββββββββββββββββββββ Scroll behavior: Sticky header with logo + wallet button.
Screen 2: Dashboard (Home) text βββββββββββββββββββββββββββββββββββββββββββββββ β π₯ Dashboard [Notif] [Profile] π€ β β Header (fixed) βββββββββββββββββββββββββββββββββββββββββββββββ€ β β β π₯ β β 23 β β Streak number (lime, huge) β DAY STREAK β β Caption (gray, small) β β β βββββββββββββββββββββββββββββββββββββ β β β β Active Commitments (2) β β Section header β β β βββββββββββββββββββββββββββββββββββββ β β β π₯ 23 days [ACTIVE] β β β Commitment card 1 β β β β β β Exercise every morning β β β β 0.5 SOL Β· $67.20 β β β β β β β β βββββββββββββββββββ 23/30 β β β Progress β β β β β β Next: in 4 hours β β β βββββββββββββββββββββββββββββββββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β π₯ 7 days [AT RISK β ] β β β Card 2 (orange) β β β β β β No junk food β β β β 100 USDC Β· $100 β β β β β β β β βββββββββββββββββ 7/30 β β β β β β β β β CHECK IN NOW (2 hrs left) β β β βββββββββββββββββββββββββββββββββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β β Browse Pools β β CTA link (cyan) β View Leaderboard β β β β [π₯ CHECK IN] β β FAB (bottom right) βββββββββββββββββββββββββββββββββββββββββββββββ β Home Pools Stats Verify Profile β β Bottom nav βββββββββββββββββββββββββββββββββββββββββββββββ Pull-to-refresh: Updates stake USD values, checks for verifications.
Screen 3: Create Commitment text βββββββββββββββββββββββββββββββββββββββββββββββ β β Back New Commitment β βββββββββββββββββββββββββββββββββββββββββββββββ€ β β β Your Goal β β Label β βββββββββββββββββββββββββββββββββββββ β β β Exercise every morning β β β Text input β βββββββββββββββββββββββββββββββββββββ β β β β Duration β β βββββββ¬ββββββ¬ββββββ¬ββββββ¬ββββββ β β β 7 β 14 β β 60 β 90 β β β Chip selector β βββββββ΄ββββββ΄ββββββ΄ββββββ΄ββββββ β β days β β β β Stake Amount β β ββββββββββββββββββ¬βββββββββββββββ β β β 0.5 β SOL βΌ β β β Input + dropdown β ββββββββββββββββββ΄βββββββββββββββ β β β $67.20 USD β β Live conversion β β β Verifier (who checks your progress?) β β βββββββββββββββββββββββββββββββββββββ β β β @alice.near β β β β Autocomplete β βββββββββββββββββββββββββββββββββββββ β β Or paste wallet address β β β β Privacy β β βββββββββββββββββββββββββββββββββββ β β β βͺ Public β« Confidential β β β Toggle β βββββββββββββββββββββββββββββββββββ β β (Confidential hides stake amount) β β β β βββββββββββββββββββββββββββββββββββββ β β β β Preview: β β β’ Daily check-in required β β β’ If you succeed: stake + pool share β β β’ If you fail: 80% to winners, 20% fee β β β β βββββββββββββββββββββββββββββββββββββ β β β COMMIT & STAKE (0.5 SOL) β β β Primary CTA β βββββββββββββββββββββββββββββββββββββ β β β βββββββββββββββββββββββββββββββββββββββββββββββ Validation: All fields required. Minimum stake: 0.1 NEAR equivalent.
Screen 4: Pools Browser text βββββββββββββββββββββββββββββββββββββββββββββββ β π₯ Pools [Filter π] β βββββββββββββββββββββββββββββββββββββββββββββββ€ β β β Join a pool or create your own β β β β Categories: β β βββββββ¬ββββββ¬ββββββ¬ββββββ¬ββββββ β β β[All]βFit. βDiet βProd.βStudyβ β β Filters β βββββββ΄ββββββ΄ββββββ΄ββββββ΄ββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β πͺ 30-Day Fitness Challenge β β β Pool card β β β β β β 47 participants Β· $4,200 staked β β β β Starts: Mar 1, 2026 β β β β β β β β [JOIN POOL β] β β β βββββββββββββββββββββββββββββββββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β π₯ Sugar-Free February β β β β β β β β 23 participants Β· $1,850 staked β β β β Starts: Tomorrow β β β β β β β β [JOIN POOL β] β β β βββββββββββββββββββββββββββββββββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β π» Daily Coding Streak β β β β β β β β 89 participants Β· $8,900 staked β β β β In progress (Day 12/30) β β β β β β β β [VIEW DETAILS β] β β β βββββββββββββββββββββββββββββββββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β + CREATE CUSTOM POOL β β β Secondary CTA β βββββββββββββββββββββββββββββββββββββ β β β βββββββββββββββββββββββββββββββββββββββββββββββ Tap pool card β opens detail modal with participant list, rules, join button.
Screen 5: Leaderboard text βββββββββββββββββββββββββββββββββββββββββββββββ β π Leaderboard [Filter: All βΌ] β βββββββββββββββββββββββββββββββββββββββββββββββ€ β β β Top Streakers β β β β βββββββββββββββββββββββββββββββββββββ β β β π₯ @bob.near π₯ 142 days β β β Gold border β β 18.5 NEAR staked β β β βββββββββββββββββββββββββββββββββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β π₯ @carol.eth π₯ 89 days β β β Silver border β β 12.0 ETH staked β β β βββββββββββββββββββββββββββββββββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β π₯ @dan.sol π₯ 76 days β β β Bronze border β β 250 SOL staked β β β βββββββββββββββββββββββββββββββββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β #4 @eve.near π₯ 54 days β β β β 5.2 NEAR staked β β β βββββββββββββββββββββββββββββββββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β #5 @frank.btc π₯ 47 days β β β β 0.08 BTC staked β β β βββββββββββββββββββββββββββββββββββββ β β β β ... β β β β βββββββββββββββββββββββββββββββββββββ β β β #47 YOU @montaq.near π₯ 23 days β β β User row (lime) β β 0.5 SOL staked β β β βββββββββββββββββββββββββββββββββββββ β β β βββββββββββββββββββββββββββββββββββββββββββββββ Filter options: All time / This month / Fitness / Diet / Productivity.
Screen 6: Profile text βββββββββββββββββββββββββββββββββββββββββββββββ β β Back @montaq.near [β Edit] β βββββββββββββββββββββββββββββββββββββββββββββββ€ β β β π€ β β Avatar (auto-gen) β @montaq.near β β montaq.pool.near β β Full address (mono) β β β ββββββββββ¬βββββββββ¬βββββββββ β β β 23 β 2 β 67% β β β Stats grid β β Days βActive βSuccess β β β ββββββββββ΄βββββββββ΄βββββββββ β β β β βββββββββββββββββββββββββββββββββββββ β β β β Achievements π β β β β ββββββ¬βββββ¬βββββ¬βββββ β β β π₯ β π― β π β π β β β Badge grid β ββββββ΄βββββ΄βββββ΄βββββ β β 7-day 30-day Perfect 100-day β β β β βββββββββββββββββββββββββββββββββββββ β β β β Past Streaks (14) β β β β β No junk food - 30 days (completed) β β β Exercise daily - 60 days (completed) β β β Meditation - 14/30 days (failed) β β β Reading - 21 days (completed) β β β β [VIEW ALL β] β β β β βββββββββββββββββββββββββββββββββββββ β β β β Total Earned: $287.40 β β Lifetime stats β Total Forfeited: $50.00 β β β β βββββββββββββββββββββββββββββββββββββ β β β SHARE PROFILE β β β Share card CTA β βββββββββββββββββββββββββββββββββββββ β β β βββββββββββββββββββββββββββββββββββββββββββββββ Settings (gear icon): Notifications, wallet management, privacy, delete account.
PWA Features Installation Prompt text Trigger: After 2 successful check-ins Location: Bottom banner (dismissible) Copy: "Add Streak to your home screen for faster check-ins" CTA: "INSTALL" (lime button)
iOS: Uses native share sheet β "Add to Home Screen" Android: Native install prompt Desktop: Chrome install banner Offline Support text Service Worker Caching Strategy:
- Static assets (JS, CSS, fonts): Cache first
- Images: Cache with network fallback
- API calls: Network first, cache fallback
- Smart contract calls: Network only (fails gracefully)
Offline UI:
- Gray banner at top: "You're offline β changes will sync when connected"
- Check-ins queue locally, submit when online
- Read-only mode for dashboard (cached data shown with timestamp) Push Notifications text Permission Request:
- Ask after first commitment created
- Modal: "Get reminders so you never miss a check-in"
- CTA: "ENABLE NOTIFICATIONS"
Notification Types:
- Check-in reminder: "Check in due in 1 hour π₯"
- Milestone: "You've hit 10 days! Keep going πͺ"
- At risk: "You missed your check-in β you have 2 hours left
β οΈ " - Verifier: "@username needs your approval to check in"
- Pool update: "3 people joined your pool today"
- Payout: "You earned 0.68 SOL from your streak! π"
All notifications deep link to relevant screen. App Shortcuts (Android) text Long-press app icon:
- "Check In" β Opens check-in modal
- "View Streak" β Opens dashboard
- "New Commitment" β Opens create form iOS Home Screen Widget (future) text Small widget: Shows current streak count + days remaining Medium widget: Shows next check-in countdown Large widget: Shows leaderboard top 3 Accessibility WCAG 2.1 AA Compliance Color Contrast:
All text: Minimum 4.5:1 against background
Lime (#CCFF00) on black (#000000): 16.8:1 β
Gray (#A0A0A0) on black: 7.1:1 β
Focus States:
All interactive elements have visible focus ring (2px lime outline)
Keyboard navigation: Tab order matches visual hierarchy
Skip links: "Skip to main content"
Screen Reader Support:
All images have alt text
Icons have aria-labels
Form inputs have associated labels
Status announcements use aria-live regions Example: "Check-in successful, you're on day 23"
Motion Preferences:
css @media (prefers-reduced-motion: reduce) {
- { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } } Font Scaling:
Supports browser zoom up to 200%
Uses relative units (rem, em) for all type
Layout reflows gracefully
Touch Targets:
Minimum 44x44px (iOS guideline)
Adequate spacing between tappable elements (min 8px)
Performance Targets Core Web Vitals text Largest Contentful Paint (LCP): < 2.5s First Input Delay (FID): < 100ms Cumulative Layout Shift (CLS): < 0.1 Time to Interactive (TTI): < 3.5s Optimization Strategies Code Splitting:
Route-based code splitting (Next.js automatic)
Lazy load modals/bottom sheets (React.lazy)
Dynamic imports for heavy libraries (Lottie, GSAP)
Asset Optimization:
Images: WebP format, responsive sizes, lazy loading
Fonts: WOFF2, preload critical fonts, font-display: swap
SVG icons: Inline for above-fold, sprite sheet for others
Bundle Size Budget:
Initial JS: < 150kb (gzipped)
Initial CSS: < 50kb (gzipped)
Total page weight: < 500kb
Caching Strategy:
Static assets: 1 year cache (cache-busting via hashed filenames)
API responses: 5 minute cache (stale-while-revalidate)
Smart contract data: 30 second cache
Monitoring:
Lighthouse CI in GitHub Actions (fails if score < 90)
Real User Monitoring via PostHog
Bundle size tracking via bundlesize.js
Security & Privacy Data Collection (Minimal) Stored On-Chain:
Commitment metadata (goal text, duration, stake amount)
Check-in timestamps
Verifier address
Settlement results
Stored Off-Chain (Supabase):
User profile (username, avatar URL)
Goal templates (public)
Social feed posts (optional, user-generated)
Not Collected:
Email addresses (not required)
Phone numbers
KYC data
Geolocation
Device fingerprints
Privacy Features Confidential Intents:
Stake amounts hidden on-chain (ZK proofs) [web:657]
Only user and verifier can see actual amount
Public pools show participant count, not individual stakes
Data Portability:
Export all data as JSON (GDPR compliance)
Delete account: purges off-chain data, on-chain data remains (immutable)
Wallet Permissions:
Read-only by default
Transaction signing requires explicit user approval
No auto-sign (no gasless relayers by default)
Smart Contract Security Audit Checklist:
Reentrancy guards on all fund transfers
Integer overflow/underflow protections (Rust u128 checks)
Access control on admin functions
Emergency pause mechanism (multisig controlled)
Rate limiting on commitment creation
Verifier staking (skin in the game)
Timelock on contract upgrades (48 hour delay)
Bug Bounty:
$5,000 β $50,000 depending on severity
Reported via Immunefi
Launch Checklist Pre-Launch (Week -2) Smart contract deployed to NEAR testnet
Internal security audit completed
NEAR Intents integration tested on testnet
Frontend deployed to staging (Vercel preview)
10 beta testers onboarded (internal team)
Bug tracking board setup (Linear)
Launch Week (Week 0) Smart contract deployed to NEAR mainnet
Frontend live at streak.app
Landing page SEO optimized
Social media accounts created (@streakapp)
Product Hunt page prepared
Press kit created (screenshots, logos, copy)
Discord/Telegram community channels opened
Post-Launch (Week +1) Submit to Product Hunt
Post on NEAR Forum
Submit NEAR Foundation grant application
Share on Crypto Twitter (CT)
Monitor Sentry for errors
Daily user feedback calls
Growth (Month 1-3) Weekly feature releases
Integrate with fitness APIs (Apple Health, Strava)
Launch referral program
Sponsor NEAR ecosystem podcasts
Conference presence (NEARCON 2026)
Success Metrics North Star Metric Active Commitments β number of currently in-progress stakes.
Supporting Metrics Acquisition:
New users per week
Wallet connection rate
Source attribution (Product Hunt, Twitter, organic)
Activation:
% of users who create first commitment
Time to first commitment
Average stake size
Retention:
Daily Active Users (DAU)
Weekly check-in rate
% of users who create 2nd commitment after completing 1st
Revenue:
Total value locked (TVL) in contracts
Protocol fees earned per week
Average forfeit rate
Referral:
Viral coefficient (K-factor)
% of commitments with invited verifiers
Social shares per completed streak
Target KPIs (End of Month 3) text 1,000 registered users 300 active commitments $50,000 TVL $2,000/week protocol revenue 30% user completion rate (reasonable for hard goals) Future Roadmap Phase 2 (Month 4-6) Team Streaks: Groups commit together, shared pool
Smart Verifiers: Oracle integration (Chainlink, UMA) for automated verification
Apple Health API for fitness goals
GitHub commits for coding goals
Screen time API for digital detox
Streak NFTs: Mint an NFT for completed 90+ day streaks (flex)
Recurring Commitments: Auto-renew monthly (subscription-like)
Phase 3 (Month 7-12) DAO Governance: Protocol fee distribution decided by token holders
Staking Pools: Passive staking for non-participants (liquidity providers earn yield)
Insurance Market: Buy/sell "streak insurance" (if you fail, insurance pays out)
Mobile App: Native iOS/Android (React Native or Flutter) for better notifications
Phase 4 (Year 2+) B2B SaaS: White-label for corporate wellness programs
AI Coach: LLM-powered personal accountability assistant
Cross-Chain Expansion: Deploy contracts on Solana, Ethereum L2s (maintain NEAR as primary)
Brand Voice & Copywriting Tone Confident, direct, slightly edgy. No corporate speak. No false motivation. This is about money and accountability β own it.
Good examples:
"Put money on the line. Change your life."
"Succeed and win. Fail and forfeit."
"Your friend verifies you checked in β or you lose your stake."
Bad examples:
"Join our community of goal-setters!" (too generic)
"Unlock your potential with blockchain!" (buzzword soup)
"We're here to support your journey" (fake motivation)
Copywriting Guidelines Headlines: Bold, short, declarative. Max 8 words. Body: Conversational but precise. Write like you're texting a smart friend. CTAs: Action verbs. "START YOUR STREAK" not "Get Started". Errors: Human, helpful. "Oops, connection failed β try again?" not "Error code 500".
Microcopy examples:
Empty state (no active commitments): "No streaks yet. What are you waiting for?"
Loading screen: "Locking your funds on-chain..."
Success toast: "Day 7 complete! π₯ You're crushing it"
Failure modal: "Streak broken. That $50 just funded someone else's win."
Open Questions / Future Decisions Verifier incentives: Should verifiers earn a fee per verification? (Currently: 0.01 NEAR per check-in)
Dispute resolution: What happens if user and verifier disagree? (Currently: manual DAO vote)
Grace periods: How long after a missed check-in before auto-forfeit? (Currently: 2 hours)
Minimum stake: Prevent spam commitments? (Suggested: 0.1 NEAR equivalent / ~$0.40)
Maximum pool size: Cap participants per pool for fairness? (Suggested: 500 users max)
Social features: In-app chat between user and verifier? Public comments on streaks?
Gamification: Leaderboards, badges, titles β how much is too much?
Appendix: Design System Export Color Tokens (CSS Variables):
css :root { --color-black: #000000; --color-obsidian: #0F0F0F; --color-charcoal: #1A1A1A; --color-lime: #CCFF00; --color-red: #FF0055; --color-orange: #FF6B00; --color-cyan: #00F0FF; --color-white: #FFFFFF; --color-gray-light: #A0A0A0; --color-gray-dark: #606060; --color-slate: #4A4A4A; } Typography Tokens:
css :root { --font-primary: 'Satoshi', 'Inter', system-ui, sans-serif; --font-mono: 'JetBrains Mono', monospace;
--font-display: 900; --font-bold: 700; --font-semibold: 600; --font-medium: 500; --font-regular: 400;
--text-display: clamp(40px, 8vw, 72px); --text-h1: clamp(28px, 5vw, 40px); --text-h2: clamp(22px, 4vw, 28px); --text-h3: 18px; --text-body-lg: 16px; --text-body: 14px; --text-caption: 12px; --text-label: 11px; } Spacing Tokens:
css :root { --space-xs: 4px; --space-sm: 8px; --space-md: 12px; --space-base: 16px; --space-lg: 24px; --space-xl: 32px; --space-2xl: 48px; --space-3xl: 64px; } Border Radius:
css :root { --radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; --radius-xl: 24px; --radius-full: 9999px; } Shadows:
css :root { --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.4); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.5); --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.6); --shadow-lime: 0 4px 12px rgba(204, 255, 0, 0.4); --shadow-red: 0 4px 12px rgba(255, 0, 85, 0.5); } Animation Tokens:
css :root { --ease-smooth: cubic-bezier(0.16, 1, 0.3, 1); --ease-bounce: cubic-bezier(0.68, -0.55, 0.27, 1.55); --duration-fast: 150ms; --duration-normal: 300ms; --duration-slow: 600ms; } Document Version History v1.0 β Feb 27, 2026
Initial technical & design specification
Complete PWA architecture defined
NEAR Intents integration documented
Gen Z design system established
All core screens wireframed
End of Specification
Ready for:
Engineering sprint planning
Design system implementation in Figma
Smart contract development kickoff
Grant application submission
Built by MontaQ Labs with π₯