<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: motorcyclediaries.fun</title>
    <description>The latest articles on DEV Community by motorcyclediaries.fun (@motodev).</description>
    <link>https://dev.to/motodev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3836017%2F82483177-1c29-454e-b776-e45635d1bfa6.png</url>
      <title>DEV Community: motorcyclediaries.fun</title>
      <link>https://dev.to/motodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/motodev"/>
    <language>en</language>
    <item>
      <title>We Fair-Launched $MOTO on Pump.Fun With Zero Hype Budget — Here's What the First Week Looks Like When You Choose Building Over Marketing</title>
      <dc:creator>motorcyclediaries.fun</dc:creator>
      <pubDate>Mon, 13 Apr 2026 08:53:49 +0000</pubDate>
      <link>https://dev.to/motodev/we-fair-launched-moto-on-pumpfun-with-zero-hype-budget-heres-what-the-first-week-looks-like-5c5b</link>
      <guid>https://dev.to/motodev/we-fair-launched-moto-on-pumpfun-with-zero-hype-budget-heres-what-the-first-week-looks-like-5c5b</guid>
      <description>&lt;h2&gt;
  
  
  Most Projects Launch a Token and Then Start Building. We Did It Backwards.
&lt;/h2&gt;

&lt;p&gt;For the last month, we've been heads-down building. A custom website. A full-stack Telegram bot with email verification. A meme contest platform. An endless runner game with Solana wallet integration. A dashboard with leaderboards, quests, streaks, and referral tracking.&lt;/p&gt;

&lt;p&gt;All of it live. All of it working. All of it running on $3/month hosting.&lt;/p&gt;

&lt;p&gt;And then — only after everything was built — we launched $MOTO on &lt;a href="https://pump.fun/coin/5Z66s3FKyYmReo5bJoiWAgpH6o8HqAg2UKtqkGurmoto" rel="noopener noreferrer"&gt;pump.fun&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is the story of what happens when you fair-launch a meme coin the way it was meant to be done: no presale, no insiders, no marketing budget, and absolute transparency about where things stand.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Pump.Fun and Why We Chose It
&lt;/h2&gt;

&lt;p&gt;For those unfamiliar: &lt;a href="https://pump.fun" rel="noopener noreferrer"&gt;pump.fun&lt;/a&gt; is a Solana-based token launchpad that uses a bonding curve mechanism. Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Anyone can create a token&lt;/strong&gt; — You set the name, symbol, image, description, and social links. Cost: essentially just gas fees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bonding curve pricing&lt;/strong&gt; — Early buyers get lower prices. As more SOL enters the bonding curve, the price increases mathematically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graduation&lt;/strong&gt; — When the bonding curve fills (~85 SOL), the token "graduates" to Raydium (a decentralized exchange) with auto-generated liquidity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No presale&lt;/strong&gt; — Everyone buys from the same curve. No VCs, no private rounds, no team allocations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We chose pump.fun because it's the most honest way to launch a meme coin. There's no backdoor. No hidden mint authority. No way for the creator to rug the liquidity. The smart contract is the same for every token on the platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Technical Details
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Token&lt;/td&gt;
&lt;td&gt;Moto Coin Diaries ($MOTO)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chain&lt;/td&gt;
&lt;td&gt;Solana&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Supply&lt;/td&gt;
&lt;td&gt;1,000,000,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Launch Platform&lt;/td&gt;
&lt;td&gt;pump.fun&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Presale&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team Allocation&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tax&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contract&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5Z66s3FKyYmReo5bJoiWAgpH6o8HqAg2UKtqkGurmoto&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That contract address ending in &lt;code&gt;moto&lt;/code&gt;? That wasn't an accident. We used a vanity address generator to get a contract address that literally ends with our ticker. Small detail, but it matters when you care about the craft.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Built Before Launching
&lt;/h2&gt;

&lt;p&gt;Here's what separates $MOTO from the 10,000 tokens that launch on pump.fun every day: &lt;strong&gt;we built the entire ecosystem first.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most pump.fun tokens launch with nothing — maybe a Telegram group and a prayer. Here's what we shipped before a single SOL touched our bonding curve:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Full Custom Website — &lt;a href="https://motorcyclediaries.fun" rel="noopener noreferrer"&gt;motorcyclediaries.fun&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Not a template. Not a landing page generator. A full custom-built experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dark glassmorphism design with neon-green accents&lt;/li&gt;
&lt;li&gt;Interactive image gallery with Ken Burns cinematics&lt;/li&gt;
&lt;li&gt;PWA support (installable on mobile)&lt;/li&gt;
&lt;li&gt;SEO-optimized (JSON-LD, Open Graph, Twitter Cards, sitemap)&lt;/li&gt;
&lt;li&gt;AI-crawler friendly (&lt;code&gt;llms.txt&lt;/code&gt; for ChatGPT, Claude, Perplexity)&lt;/li&gt;
&lt;li&gt;Multi-page: Manifesto, About, Privacy Policy, Verification Portal&lt;/li&gt;
&lt;li&gt;Security-hardened &lt;code&gt;.htaccess&lt;/code&gt; with CSP, HSTS, attack path blocking
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend:     HTML/CSS/JS (zero frameworks)
Hosting:      Hostinger shared + Cloudflare CDN
First Paint:  &amp;lt;700ms
Total Size:   ~7MB (after aggressive image optimization)
Monthly Cost: ~$3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Telegram Bot Ecosystem — &lt;a href="https://t.me/motodiariesbot?start=join" rel="noopener noreferrer"&gt;@motodiariesbot&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A full-stack community management system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email Verification Portal&lt;/strong&gt; — Members verify via email before chatting. Custom-built with SPF/DMARC. Zero spam bots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live X/Twitter Integration&lt;/strong&gt; — Every post auto-shared with images and engagement metrics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raid Command Center&lt;/strong&gt; — Real-time Twitter raid tracking with progress bars.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Member Intelligence&lt;/strong&gt; — Name change detection, join tracking, anti-flood, anti-scam.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily Analytics&lt;/strong&gt; — Google Analytics reports delivered to the group.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leaderboard System&lt;/strong&gt; — Top raiders, most active members, all tracked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built with Python 3 + &lt;code&gt;python-telegram-bot&lt;/code&gt; v21, running as a &lt;code&gt;systemd&lt;/code&gt; service.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Endless Runner Game — &lt;a href="https://motorcyclediaries.fun/game" rel="noopener noreferrer"&gt;motorcyclediaries.fun/game&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A full Phaser.js browser game:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Neon-themed infinite highway runner&lt;/li&gt;
&lt;li&gt;6 Solana wallet integrations (Phantom, Solflare, Backpack, Trust, Coinbase, OKX)&lt;/li&gt;
&lt;li&gt;Daily Grand Prix tournament with live leaderboard&lt;/li&gt;
&lt;li&gt;Quest system, streak bonuses, referral tracking&lt;/li&gt;
&lt;li&gt;Anti-cheat with server-side session validation&lt;/li&gt;
&lt;li&gt;Share-to-X integration after every run&lt;/li&gt;
&lt;li&gt;Community stats tracking daily rides and riders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backend: FastAPI + SQLite, exposed via Cloudflare Tunnel, proxied through PHP on shared hosting.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Meme Contest Platform — &lt;a href="https://motorcyclediaries.fun/memes" rel="noopener noreferrer"&gt;motorcyclediaries.fun/memes&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A full voting and sharing platform:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload images, GIFs, and videos&lt;/li&gt;
&lt;li&gt;Like/dislike voting with animated score bars&lt;/li&gt;
&lt;li&gt;Share to X/Telegram/clipboard with bonus points&lt;/li&gt;
&lt;li&gt;Top 3 podium with real-time updates&lt;/li&gt;
&lt;li&gt;Dashboard integration with earned badges&lt;/li&gt;
&lt;li&gt;IP-based anti-abuse for fair voting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Rider Dashboard — &lt;a href="https://motorcyclediaries.fun/dashboard" rel="noopener noreferrer"&gt;motorcyclediaries.fun/dashboard&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A comprehensive player hub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Game stats (best score, total rides, streak)&lt;/li&gt;
&lt;li&gt;Grand Prix standings&lt;/li&gt;
&lt;li&gt;Quest progress tracking&lt;/li&gt;
&lt;li&gt;Ride history with per-game breakdowns&lt;/li&gt;
&lt;li&gt;Achievement badges (First Ride, Veteran, Legend)&lt;/li&gt;
&lt;li&gt;Referral system with unique codes&lt;/li&gt;
&lt;li&gt;Meme activity and earned tags&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Honest Numbers
&lt;/h2&gt;

&lt;p&gt;Here's where most projects would lie. We won't.&lt;/p&gt;

&lt;p&gt;Our bonding curve? &lt;strong&gt;Still early.&lt;/strong&gt; We're not pretending to be the next 100x moonshot. We're a community project built by three friends with zero marketing budget.&lt;/p&gt;

&lt;p&gt;Here's the raw truth:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Marketing spend&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Influencers paid&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paid promotions&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of code&lt;/td&gt;
&lt;td&gt;8,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Features shipped&lt;/td&gt;
&lt;td&gt;20+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure cost&lt;/td&gt;
&lt;td&gt;~$3/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team members&lt;/td&gt;
&lt;td&gt;3 friends&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We didn't pay a single influencer. We didn't buy a single ad. We didn't DM a single "crypto guru" begging for a shout-out. Everything you see was built, written, and shared by three people who believe that &lt;strong&gt;building something real is the marketing.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Fair Launch Actually Feels Like
&lt;/h2&gt;

&lt;p&gt;Nobody talks about this part. Here's the honest developer experience of fair-launching on pump.fun:&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 0: The Launch
&lt;/h3&gt;

&lt;p&gt;You fill out the form. Name, ticker, image, description, links. You click create. Your token exists on Solana within seconds.&lt;/p&gt;

&lt;p&gt;Then... silence.&lt;/p&gt;

&lt;p&gt;There's no notification bell. No confetti. No "congratulations, you're now a crypto founder." Just a bonding curve page with 0 SOL in it and the weight of everything you built sitting behind a URL that nobody has clicked yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 1-3: The Builders' Paradox
&lt;/h3&gt;

&lt;p&gt;The hardest part isn't coding — it's the psychological game. Pump.fun shows you real-time trades. Every buy feels like validation. Every period of silence feels like failure.&lt;/p&gt;

&lt;p&gt;But here's what we learned: &lt;strong&gt;the silence is normal.&lt;/strong&gt; Every single successful project on pump.fun went through this phase. The difference between the ones that made it and the ones that died? The ones that made it &lt;strong&gt;kept building during the silence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So that's what we did.&lt;/p&gt;

&lt;h3&gt;
  
  
  What We Shipped After Launch
&lt;/h3&gt;

&lt;p&gt;While the bonding curve sat quietly, we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployed automated community stats to the game (daily ride simulation for social proof)&lt;/li&gt;
&lt;li&gt;Set up &lt;code&gt;systemd&lt;/code&gt; timers for automated daily data seeding&lt;/li&gt;
&lt;li&gt;Debugged and fixed the PHP proxy chain for the game API&lt;/li&gt;
&lt;li&gt;Continued posting organic content on X&lt;/li&gt;
&lt;li&gt;Kept the Telegram community engaged with raids and updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We didn't stop. We didn't panic. We didn't buy our own token to fake volume. We just kept building.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture That Powers Everything
&lt;/h2&gt;

&lt;p&gt;Here's the full technical stack, for fellow devs who appreciate the engineering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== FRONTEND ===
Website:        Vanilla HTML/CSS/JS (no frameworks)
Game:           Phaser 3 (Canvas renderer)
Meme Platform:  Vanilla JS + CSS animations
Dashboard:      Vanilla JS + Chart components
Hosting:        Hostinger shared hosting
CDN:            Cloudflare (free tier)

=== BACKEND ===
Telegram Bot:   Python 3 + python-telegram-bot v21
Game API:       FastAPI + Uvicorn (Python)
Meme API:       PHP + JSON file storage
Game Database:  SQLite (aiosqlite)
Email:          PHP mail() + SPF/DMARC

=== INFRASTRUCTURE ===
Tunneling:      Cloudflare quick tunnels
Process Mgmt:   systemd services + timers
Scheduling:     systemd timers (cron replacement)
Proxy:          PHP reverse proxy on shared hosting

=== COST ===
Hosting:        ~$3/month
Domain:         ~$1/month (bundled)
Everything Else: $0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entire project runs on approximately &lt;strong&gt;$3/month&lt;/strong&gt;. No AWS. No Vercel. No $200/month database. Just shared hosting, Cloudflare's free tier, and a lot of creative problem-solving.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Cloudflare Tunnel Trick
&lt;/h3&gt;

&lt;p&gt;Our biggest infrastructure challenge: the backend server sits behind a residential ISP that blocks incoming connections. No static IP, no port forwarding.&lt;/p&gt;

&lt;p&gt;Solution: &lt;code&gt;cloudflared&lt;/code&gt; tunnel that exposes &lt;code&gt;localhost:8901&lt;/code&gt; as a public HTTPS endpoint. The shared hosting server has a PHP proxy that forwards API requests to this tunnel URL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Browser] → [Cloudflare CDN] → [Hostinger PHP Proxy]
                                        ↓
                              [Cloudflare Tunnel URL]
                                        ↓
                              [localhost:8901 FastAPI]
                                        ↓
                                    [SQLite DB]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's not elegant. It's not what you'd find in a "best practices" guide. But it works, it's free, and it handles our traffic without breaking a sweat.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why We're Transparent About Using AI
&lt;/h2&gt;

&lt;p&gt;Yes, we use AI. For code assistance, image generation, content drafting, and debugging.&lt;/p&gt;

&lt;p&gt;In 2026, pretending you don't use AI tools is the real dishonesty. Every developer uses Copilot, ChatGPT, Claude, or some combination. We just say it out loud.&lt;/p&gt;

&lt;p&gt;What AI &lt;strong&gt;doesn't&lt;/strong&gt; do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make architectural decisions&lt;/li&gt;
&lt;li&gt;Understand our community&lt;/li&gt;
&lt;li&gt;Write authentic stories&lt;/li&gt;
&lt;li&gt;Build relationships&lt;/li&gt;
&lt;li&gt;Choose honesty when lying would be easier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The human decisions are what matter. The AI helps us execute faster.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Philosophy: Build First, Hype Never
&lt;/h2&gt;

&lt;p&gt;Here's what we believe, and what makes this project different:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Product before token.&lt;/strong&gt; We built 8,000+ lines of working code before launching a single token. Most pump.fun projects do the opposite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Transparency over performance.&lt;/strong&gt; We tell you our bonding curve is early. We tell you we have zero marketing budget. We tell you this might fail. When was the last time a crypto project said that?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Community over numbers.&lt;/strong&gt; Our Telegram requires email verification. We'd rather have 50 real humans than 5,000 bots. Every member is verified, every conversation is real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Code over promises.&lt;/strong&gt; We don't have a roadmap PDF with vague promises. We have deployed, working features you can use right now. Every claim on our website has a live URL behind it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Three friends over anonymous team.&lt;/strong&gt; The creator is a 45-year-old motorcycle enthusiast who broke his nose in a crash. His childhood friend writes every line of code. Another friend runs the content and socials. That's it. No "advisory board." No "strategic partners." Just three guys who said "let's do this."&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;We're not stopping. Here's what we're actively working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;X/Twitter growth&lt;/strong&gt; — Organic engagement, authentic replies, community building&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Game updates&lt;/strong&gt; — New obstacles, power-ups, seasonal events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content pipeline&lt;/strong&gt; — Regular dev logs, technical articles, community stories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partnership outreach&lt;/strong&gt; — Connecting with motorcycle communities and crypto communities that value transparency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bonding curve progress&lt;/strong&gt; — Organic growth toward Raydium graduation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No timelines. No promises we can't keep. Just consistent building and honest communication.&lt;/p&gt;




&lt;h2&gt;
  
  
  For Fellow Developers
&lt;/h2&gt;

&lt;p&gt;If you're thinking about building a crypto community project, here's what we'd tell you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build the product first.&lt;/strong&gt; Seriously. Don't launch a token and then scramble to create value. Create value first, then tokenize it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You don't need expensive infrastructure.&lt;/strong&gt; We run everything on $3/month. Cloudflare's free tier is absurdly generous. Shared hosting handles more traffic than you think. SQLite is a real database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vanilla JS is underrated.&lt;/strong&gt; No framework, no build step, no dependency hell. Our site loads in 700ms. Try that with Next.js on shared hosting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Systemd is your friend.&lt;/strong&gt; Every background process we run is a systemd service with a timer. It's more reliable than cron, has built-in logging, and handles restarts gracefully.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be honest about AI.&lt;/strong&gt; Use it. Acknowledge it. Move on. Your human judgment is what matters — AI just helps you type faster.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Try Everything Right Now
&lt;/h2&gt;

&lt;p&gt;Every single thing mentioned in this article is live and working:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Website&lt;/td&gt;
&lt;td&gt;&lt;a href="https://motorcyclediaries.fun" rel="noopener noreferrer"&gt;motorcyclediaries.fun&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Game&lt;/td&gt;
&lt;td&gt;&lt;a href="https://motorcyclediaries.fun/game" rel="noopener noreferrer"&gt;motorcyclediaries.fun/game&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meme Contest&lt;/td&gt;
&lt;td&gt;&lt;a href="https://motorcyclediaries.fun/memes" rel="noopener noreferrer"&gt;motorcyclediaries.fun/memes&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dashboard&lt;/td&gt;
&lt;td&gt;&lt;a href="https://motorcyclediaries.fun/dashboard" rel="noopener noreferrer"&gt;motorcyclediaries.fun/dashboard&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manifesto&lt;/td&gt;
&lt;td&gt;&lt;a href="https://motorcyclediaries.fun/manifesto" rel="noopener noreferrer"&gt;motorcyclediaries.fun/manifesto&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram&lt;/td&gt;
&lt;td&gt;&lt;a href="https://t.me/motodiariesbot?start=join" rel="noopener noreferrer"&gt;@motodiariesbot&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X/Twitter&lt;/td&gt;
&lt;td&gt;&lt;a href="https://x.com/motodiariesfun" rel="noopener noreferrer"&gt;@motodiariesfun&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token&lt;/td&gt;
&lt;td&gt;&lt;a href="https://pump.fun/coin/5Z66s3FKyYmReo5bJoiWAgpH6o8HqAg2UKtqkGurmoto" rel="noopener noreferrer"&gt;pump.fun/coin/5Z66...moto&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Final Words
&lt;/h2&gt;

&lt;p&gt;$MOTO isn't the fastest horse in the race. We don't have a marketing budget. We don't have influencer deals. We don't have a viral moment.&lt;/p&gt;

&lt;p&gt;What we have is: &lt;strong&gt;everything built, everything working, and everything honest.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a space where 99% of projects launch with a logo and a dream, we launched with a website, a game, a bot ecosystem, a meme platform, a dashboard, email verification, raid systems, leaderboards, quests, streaks, referrals, and a community of real, verified humans.&lt;/p&gt;

&lt;p&gt;The bonding curve will fill when it fills. Or it won't. Either way, we built something real, we learned an incredible amount, and we documented every step of the journey.&lt;/p&gt;

&lt;p&gt;And we're not stopping.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Born to Ride. Forced to HODL. Never stop building.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This is part of the &lt;a href="https://dev.to/motodev"&gt;Motorcycle Diaries Dev Log&lt;/a&gt; series — documenting every step of building a crypto community project from scratch with $0 budget.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Previous posts:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/motodev/i-built-a-crypto-project-alone-with-0-heres-what-happened-when-i-chose-honesty-over-hype-3am2"&gt;I Built a Crypto Project Alone With $0 — Here's What Happened When I Chose Honesty Over Hype&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/motodev/we-built-a-full-meme-contest-platform-in-one-day-heres-every-feature-we-shipped-451a"&gt;We Built a Full Meme Contest Platform in One Day&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/motodev/i-built-an-endless-runner-game-with-phaserjs-solana-wallets-and-zero-budget-heres-how-5hec"&gt;I Built an Endless Runner Game With Phaser.js, Solana Wallets, and Zero Budget&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;$MOTO is a meme token on Solana for entertainment and community purposes. This is not financial advice. Always DYOR. Never invest more than you can afford to lose.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>solana</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built an Endless Runner Game With Phaser.js, Solana Wallets, and Zero Budget — Here's How</title>
      <dc:creator>motorcyclediaries.fun</dc:creator>
      <pubDate>Sun, 22 Mar 2026 20:32:15 +0000</pubDate>
      <link>https://dev.to/motodev/i-built-an-endless-runner-game-with-phaserjs-solana-wallets-and-zero-budget-heres-how-5hec</link>
      <guid>https://dev.to/motodev/i-built-an-endless-runner-game-with-phaserjs-solana-wallets-and-zero-budget-heres-how-5hec</guid>
      <description>&lt;h2&gt;
  
  
  MOTO: The Midnight Ride — A Full Browser Game Built From Scratch
&lt;/h2&gt;

&lt;p&gt;What started as a meme coin project turned into something nobody expected: a &lt;strong&gt;full-featured browser game&lt;/strong&gt; with physics, power-ups, leaderboards, wallet integration, anti-cheat, daily tournaments, and a quest system.&lt;/p&gt;

&lt;p&gt;All running on vanilla JavaScript, Phaser 3, and a PHP backend. Total infrastructure cost: &lt;strong&gt;$3/month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Play it now:&lt;/strong&gt; &lt;a href="https://motorcyclediaries.fun/game" rel="noopener noreferrer"&gt;motorcyclediaries.fun/game&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the technical deep-dive into how we built it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Game: What Is It?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MOTO: The Midnight Ride&lt;/strong&gt; is a neon-fueled endless runner where you ride a motorcycle through an infinite highway, dodging obstacles (we call them "FUD"), collecting diaries and coins, grabbing power-ups, and competing for the daily Grand Prix leaderboard.&lt;/p&gt;

&lt;p&gt;Think Chrome Dino meets Subway Surfers, but on Solana with a meme coin twist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Mechanics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jump&lt;/strong&gt; (SPACE / tap top) — leap over low obstacles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duck&lt;/strong&gt; (DOWN / tap bottom) — slide under high obstacles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dash&lt;/strong&gt; (SHIFT) — burst forward with invincibility frames&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collect&lt;/strong&gt; — Diaries (+100pts), Coins (+50pts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power-ups&lt;/strong&gt; — Shield, Nitro, Magnet, 2x Score multiplier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progressive difficulty&lt;/strong&gt; — Speed increases every stage&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Game Engine:     Phaser 3 (Canvas renderer)
Frontend:        Vanilla HTML/CSS/JS
Backend API:     PHP with JSON storage
Wallet:          Multi-wallet Solana (Phantom, Solflare, Backpack, Trust, Coinbase, OKX)
Hosting:         Hostinger shared hosting + Cloudflare CDN
Total Cost:      ~$3/month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No React. No Next.js. No Firebase. No AWS. Just raw code on cheap shared hosting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Game Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phaser 3 Setup
&lt;/h3&gt;

&lt;p&gt;We use Phaser 3 with Arcade Physics. The game runs at 800x400 and auto-scales to fit any screen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;phaserGame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Phaser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Game&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Phaser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CANVAS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gameContainer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#06060e&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;physics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;arcade&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;arcade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;gravity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Phaser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Scale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FIT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;autoCenter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Phaser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Scale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CENTER_BOTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;BootScene&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PlayScene&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Canvas over WebGL?&lt;/strong&gt; Compatibility. Our target audience includes mobile users on older Android devices and people clicking links from Telegram. Canvas mode ensures the game runs everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two-Scene Architecture
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;BootScene&lt;/strong&gt; — Loads all assets (sprites, sounds, textures)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PlayScene&lt;/strong&gt; — The actual game loop&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This separation ensures assets are fully loaded before gameplay starts, preventing visual glitches.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Road System: Infinite Scrolling
&lt;/h2&gt;

&lt;p&gt;The neon highway is built with parallax scrolling layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Background&lt;/strong&gt; — Deep space/city gradient (slowest)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mid-ground&lt;/strong&gt; — Distant buildings and neon lights&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Road surface&lt;/strong&gt; — The actual riding lane (fastest)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foreground&lt;/strong&gt; — Speed lines and particle effects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each layer scrolls at a different speed, creating depth. The road itself is an infinitely tiling sprite that accelerates as stages progress.&lt;/p&gt;




&lt;h2&gt;
  
  
  Obstacle &amp;amp; Collectible Spawning
&lt;/h2&gt;

&lt;p&gt;Obstacles spawn with increasing frequency and variety as the player progresses through stages. The spawner uses a weighted random system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Early game: Simple low obstacles (jump over them)&lt;/li&gt;
&lt;li&gt;Mid game: Mix of low and high obstacles (jump or duck)&lt;/li&gt;
&lt;li&gt;Late game: Rapid sequences requiring quick reflexes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Collectibles (diaries and coins) spawn in patterns — arcs, lines, zigzags — giving players something to chase between obstacles.&lt;/p&gt;




&lt;h2&gt;
  
  
  Power-Up System
&lt;/h2&gt;

&lt;p&gt;Four power-ups drop randomly:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Power-Up&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🛡️ Shield&lt;/td&gt;
&lt;td&gt;Absorbs one hit&lt;/td&gt;
&lt;td&gt;Until triggered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚀 Nitro&lt;/td&gt;
&lt;td&gt;Speed boost + invincible&lt;/td&gt;
&lt;td&gt;3 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧲 Magnet&lt;/td&gt;
&lt;td&gt;Auto-collect nearby items&lt;/td&gt;
&lt;td&gt;5 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2️⃣ Double&lt;/td&gt;
&lt;td&gt;2x score multiplier&lt;/td&gt;
&lt;td&gt;8 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Power-ups have visual indicators — the rider glows, particles change color, and the HUD updates to show active effects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Solana Wallet Integration
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting. The game connects to Solana wallets for identity and leaderboard tracking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Wallet Support
&lt;/h3&gt;

&lt;p&gt;We support 6 wallets with auto-detection and mobile deep linking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WALLETS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;phantom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;getProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;phantom&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;solana&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;solana&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;deepLink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`https://phantom.app/ul/browse/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pageUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;solflare&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;getProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;solflare&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;deepLink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`https://solflare.com/ul/browse/?url=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pageUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// + Backpack, Trust, Coinbase, OKX&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The key insight:&lt;/strong&gt; On mobile, if a wallet app isn't installed, we use deep links to open the game &lt;em&gt;inside&lt;/em&gt; the wallet's built-in browser. This gives us wallet access without any extension installation.&lt;/p&gt;

&lt;p&gt;If the user doesn't want to connect a wallet, they can play in &lt;strong&gt;Demo Mode&lt;/strong&gt; — full game, just no leaderboard entries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Read-Only Access
&lt;/h3&gt;

&lt;p&gt;We only read the public address. No transaction signing, no token transfers, no approvals. The wallet connection is purely for identity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;walletPublicKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A prominent security message reassures users:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Your wallet is safe. Connecting only lets us verify your address — we cannot access your funds."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Scoring &amp;amp; Anti-Cheat
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Score Breakdown
&lt;/h3&gt;

&lt;p&gt;Every game over screen shows a detailed score breakdown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🛣️ Distance    342m     +342
📔 Diaries     ×5       +500
🪙 Coins       ×12      +600
⚡ Power-ups             +200
─────────────────────────
TOTAL                   1,642
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scores are calculated server-side to prevent client manipulation. The game sends raw metrics (distance, items collected, duration) and the server computes the final score.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anti-Cheat Measures
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server-side session tracking&lt;/strong&gt; — Each game starts with a server-generated session ID&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duration validation&lt;/strong&gt; — Impossibly short games with high scores are rejected&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting&lt;/strong&gt; — Maximum submissions per time window&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score reasonability&lt;/strong&gt; — Scores are validated against expected ranges for the reported distance/time&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Daily Grand Prix Tournament
&lt;/h2&gt;

&lt;p&gt;Every day, a new tournament runs automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;24-hour cycles&lt;/strong&gt; — Timer resets at midnight UTC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live leaderboard&lt;/strong&gt; — Top 3 shown as a podium (🥇🥈🥉)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time countdown&lt;/strong&gt; — Visible both in-game and on the connect screen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-refresh&lt;/strong&gt; — Leaderboard updates after every game
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;countdownSeconds&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;countdownSeconds&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nf"&gt;renderGpTimer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The countdown shows in the top banner with a prominent neon design — it's the first thing players see.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quest System
&lt;/h2&gt;

&lt;p&gt;Daily quests give players goals beyond just high scores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Ride 500m in a single run"&lt;/li&gt;
&lt;li&gt;"Collect 10 diaries"&lt;/li&gt;
&lt;li&gt;"Play 3 games today"&lt;/li&gt;
&lt;li&gt;"Score over 1,000 points"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quests are fetched per-wallet from the API and progress updates in real-time on the dashboard. Completed quests award bonus points.&lt;/p&gt;




&lt;h2&gt;
  
  
  Streak System
&lt;/h2&gt;

&lt;p&gt;Play every day to build a streak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Day 1:&lt;/strong&gt; No bonus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 2:&lt;/strong&gt; 🔥 +10% score bonus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 3:&lt;/strong&gt; 🔥🔥 +20% score bonus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 7+:&lt;/strong&gt; 🔥🔥🔥🔥🔥🔥🔥 +50% score bonus (cap)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Streaks are displayed prominently with fire emojis. Miss a day, streak resets to zero. It's a powerful retention mechanic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Share on X Integration
&lt;/h2&gt;

&lt;p&gt;After every game, players can share their score on X/Twitter with one click:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;shareScore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`🏍️ I rode &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;distance&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;m and scored &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; `&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="s2"&gt;`in MOTO: The Midnight Ride!\n\n`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="s2"&gt;`🎮 Play: motorcyclediaries.fun/game\n`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="s2"&gt;`$MOTO #Solana @motodiariesfun`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://x.com/intent/tweet?text=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sharing also earns a server-tracked bonus — encouraging viral growth.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referral System
&lt;/h2&gt;

&lt;p&gt;Every player gets unique referral links. When someone clicks your link and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visits the site:&lt;/strong&gt; +5 points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connects wallet:&lt;/strong&gt; +50 points
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plays first game:&lt;/strong&gt; +100 points&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Referral tracking uses server-side code attribution with daily caps to prevent abuse.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sound Design
&lt;/h2&gt;

&lt;p&gt;The game has a complete audio system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Background music&lt;/strong&gt; — Synthwave/neon theme (Web Audio API)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sound effects&lt;/strong&gt; — Jump, collect, power-up, crash, stage transition&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toggle button&lt;/strong&gt; — Respects user preference, persists in localStorage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All audio is generated procedurally using the Web Audio API — no external audio files needed. This keeps the total game payload tiny.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mobile Optimization
&lt;/h2&gt;

&lt;p&gt;The game works on mobile through several adaptations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Touch controls&lt;/strong&gt; — Tap top half = jump, tap bottom half = duck&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive scaling&lt;/strong&gt; — &lt;code&gt;Phaser.Scale.FIT&lt;/code&gt; ensures the game canvas fills any screen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep linking&lt;/strong&gt; — Opens inside wallet apps' built-in browsers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt; — Canvas renderer (not WebGL) for maximum compatibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Viewport lock&lt;/strong&gt; — &lt;code&gt;maximum-scale=1.0, user-scalable=no&lt;/code&gt; prevents accidental zoom&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Game Over: The Fun Part
&lt;/h2&gt;

&lt;p&gt;When you crash, a random humorous message appears:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Your bike just filed for divorce!"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Was that a crash or modern art? Hard to tell!"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Your insurance company just blocked your number!"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"You crashed so hard, Bitcoin felt it!"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are 25+ unique phrases that rotate randomly. It turns the frustration of dying into a moment of humor.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Dashboard Connection
&lt;/h2&gt;

&lt;p&gt;The game feeds into a comprehensive &lt;a href="https://motorcyclediaries.fun/dashboard" rel="noopener noreferrer"&gt;Rider Dashboard&lt;/a&gt; where connected players can see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best Score / Total Rides / Streak&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily Quests&lt;/strong&gt; progress&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grand Prix&lt;/strong&gt; standings
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ride History&lt;/strong&gt; with per-game breakdowns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Achievements &amp;amp; Badges&lt;/strong&gt; (First Ride, Veteran, Legend, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Referral Stats&lt;/strong&gt; with unique links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meme Contest&lt;/strong&gt; integration with voting and sharing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dashboard is a separate page that fetches all data from the same PHP API.&lt;/p&gt;




&lt;h2&gt;
  
  
  Backend: PHP API
&lt;/h2&gt;

&lt;p&gt;The entire backend is a single PHP file that handles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET  ?action=leaderboard     → Daily top scores
GET  ?action=profile          → Player stats + badges
GET  ?action=quests           → Daily quest progress
GET  ?action=history          → Ride history
POST ?action=start_session    → Begin new game (anti-cheat)
POST ?action=submit_score     → End game + validate score
POST ?action=ref_code         → Generate referral code
GET  ?action=ref_stats        → Referral statistics
GET  ?action=announcements    → Community announcements
GET  ?action=community_stats  → Global stats
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Data is stored in JSON files with file locking (&lt;code&gt;LOCK_EX&lt;/code&gt;). For our scale (hundreds of players, not millions), this is simpler and faster than a database.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Stats
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Game engine&lt;/td&gt;
&lt;td&gt;Phaser 3 (Canvas)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total JS size&lt;/td&gt;
&lt;td&gt;~180KB (Phaser) + ~25KB (game logic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API response time&lt;/td&gt;
&lt;td&gt;&amp;lt;50ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First paint&lt;/td&gt;
&lt;td&gt;&amp;lt;1.5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile compatible&lt;/td&gt;
&lt;td&gt;Yes (iOS + Android)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wallet support&lt;/td&gt;
&lt;td&gt;6 wallets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total hosting cost&lt;/td&gt;
&lt;td&gt;~$3/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Framework dependencies&lt;/td&gt;
&lt;td&gt;0 (besides Phaser)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What We Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Phaser 3 is incredibly powerful for browser games
&lt;/h3&gt;

&lt;p&gt;With Arcade Physics, sprite management, and auto-scaling, you can build a polished game without touching Unity or Unreal.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Canvas &amp;gt; WebGL for reach
&lt;/h3&gt;

&lt;p&gt;WebGL is faster, but Canvas works everywhere. When your users are clicking links from Telegram on random phones, compatibility wins.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Wallet integration is easier than you think
&lt;/h3&gt;

&lt;p&gt;Solana wallet providers inject a simple API. &lt;code&gt;provider.connect()&lt;/code&gt; gives you a public key. That's it. No smart contracts needed for identity.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Anti-cheat needs server-side sessions
&lt;/h3&gt;

&lt;p&gt;Client-side games are inherently insecure. Server sessions + validation + rate limiting makes cheating annoying enough that most won't bother.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Humor retains players
&lt;/h3&gt;

&lt;p&gt;The random game-over phrases generate more engagement than any fancy animation. People screenshot them, share them, come back to see new ones.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Play the game:&lt;/strong&gt; &lt;a href="https://motorcyclediaries.fun/game" rel="noopener noreferrer"&gt;motorcyclediaries.fun/game&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;See the dashboard:&lt;/strong&gt; &lt;a href="https://motorcyclediaries.fun/dashboard" rel="noopener noreferrer"&gt;motorcyclediaries.fun/dashboard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meme contest:&lt;/strong&gt; &lt;a href="https://motorcyclediaries.fun/memes" rel="noopener noreferrer"&gt;motorcyclediaries.fun/memes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join the community:&lt;/strong&gt; &lt;a href="https://t.me/motodiariesbot?start=join" rel="noopener noreferrer"&gt;t.me/motodiariesbot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow on X:&lt;/strong&gt; &lt;a href="https://x.com/motodiariesfun" rel="noopener noreferrer"&gt;@motodiariesfun&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can play in demo mode without a wallet, or connect any Solana wallet to compete on the leaderboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;This game is part of the &lt;a href="https://motorcyclediaries.fun" rel="noopener noreferrer"&gt;Motorcycle Diaries&lt;/a&gt; ecosystem — a meme coin project built with $0 budget by three friends. No VC funding. No paid promoters. Just code, creativity, and stubbornness.&lt;/p&gt;

&lt;p&gt;The game, the meme contest, the dashboard, the Telegram bot, the email verification system — all of it was built from scratch. Every line of code.&lt;/p&gt;

&lt;p&gt;If you're a game dev thinking about adding crypto/wallet integration, it's simpler than the Web3 hype makes it sound. Connect wallet, read public key, use it as an identity. Done.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Born to Ride. Forced to HODL. Never stop building.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This is part of the &lt;a href="https://dev.to/motodev"&gt;Motorcycle Diaries Dev Log&lt;/a&gt; series. Read the previous post: &lt;a href="https://dev.to/motodev/we-built-a-full-meme-contest-platform-in-one-day-heres-every-feature-we-shipped-451a"&gt;We Built a Full Meme Contest Platform in One Day&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;$MOTO is a meme token on Solana for entertainment purposes. Not financial advice. DYOR.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>solana</category>
    </item>
    <item>
      <title>We Built a Full Meme Contest Platform in One Day — Here's Every Feature We Shipped</title>
      <dc:creator>motorcyclediaries.fun</dc:creator>
      <pubDate>Sun, 22 Mar 2026 20:28:52 +0000</pubDate>
      <link>https://dev.to/motodev/we-built-a-full-meme-contest-platform-in-one-day-heres-every-feature-we-shipped-451a</link>
      <guid>https://dev.to/motodev/we-built-a-full-meme-contest-platform-in-one-day-heres-every-feature-we-shipped-451a</guid>
      <description>&lt;h2&gt;
  
  
  Day 2 Dev Log: From Zero to a Complete Meme Contest Ecosystem
&lt;/h2&gt;

&lt;p&gt;Yesterday we had a basic meme upload. Today we shipped a &lt;strong&gt;full-stack meme contest platform&lt;/strong&gt; with voting, sharing, score tracking, social media integration, dashboards, badges, and more — all in a single day.&lt;/p&gt;

&lt;p&gt;This is the raw, unfiltered dev log of everything we built for &lt;a href="https://motorcyclediaries.fun/memes" rel="noopener noreferrer"&gt;motorcyclediaries.fun/memes&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Started With
&lt;/h2&gt;

&lt;p&gt;A simple meme page where users could upload images. That's it. No voting, no scoring, no sharing, no stats.&lt;/p&gt;

&lt;p&gt;By the end of the day, here's what we shipped:&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Animated Score Bar System on Top 3 Podium
&lt;/h2&gt;

&lt;p&gt;The Top 3 memes now have a &lt;strong&gt;live animated score bar&lt;/strong&gt; underneath each card.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every like pushes the bar forward (green → cyan gradient)&lt;/li&gt;
&lt;li&gt;Every dislike pushes it back (red → orange gradient)&lt;/li&gt;
&lt;li&gt;When a vote happens, the bar pulses with a glow animation (&lt;code&gt;barPulse&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The score number does a pop-scale effect (&lt;code&gt;scorePop&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;All updates happen &lt;strong&gt;in real-time&lt;/strong&gt; — no page refresh needed
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;barPulse&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;50&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;.4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;100&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.score-bar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="m"&gt;.8s&lt;/span&gt; &lt;span class="n"&gt;cubic-bezier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The score bar percentage is calculated as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;MAX_SCORE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MAX_SCORE&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This maps a score range of &lt;code&gt;-MAX_SCORE&lt;/code&gt; to &lt;code&gt;+MAX_SCORE&lt;/code&gt; onto a 2%–100% bar width. Even negative scores still show a small sliver so the bar never fully disappears.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Video &amp;amp; GIF Support
&lt;/h2&gt;

&lt;p&gt;Memes aren't just images anymore. We added full support for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GIF&lt;/strong&gt; — animated memes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MP4&lt;/strong&gt; — video memes up to 10MB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebM&lt;/strong&gt; — web-optimized video&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Backend changes (PHP):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$allowed_types&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s1"&gt;'image/jpeg'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'image/png'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'image/gif'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="s1"&gt;'image/webp'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'video/mp4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'video/webm'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Frontend rendering:&lt;/strong&gt;&lt;br&gt;
Videos auto-play muted and loop in both the podium and grid views:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isVideo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;mp4|webm&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;media&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;isVid&lt;/span&gt; 
  &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;video class="pc-media" src="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" muted loop autoplay playsinline&amp;gt;&amp;lt;/video&amp;gt;`&lt;/span&gt; 
  &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;img class="pc-media" src="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" alt="Meme"&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lightbox viewer also handles video — pause on close, controls visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSP Headers Updated:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;media-src 'self' blob:;
img-src 'self' data: blob:;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Social Media Share System with Bonus Points
&lt;/h2&gt;

&lt;p&gt;This was the big feature. Every meme can now be shared on &lt;strong&gt;X/Twitter&lt;/strong&gt;, &lt;strong&gt;Telegram&lt;/strong&gt;, or copied as a link.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Each share gives the meme +2 bonus score points.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The scoring formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Total Score = (Likes - Dislikes) + (Shares × 2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Backend: Share Tracking API
&lt;/h3&gt;

&lt;p&gt;New &lt;code&gt;share&lt;/code&gt; action in our PHP API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'share'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="nv"&gt;$shareKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'ip:'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;':'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$platform&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;':'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$meme_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'shares'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nv"&gt;$shareKey&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'bonus'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="k"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'shares'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'shares'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'shares'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nv"&gt;$shareKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'platform'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$platform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="s1"&gt;'time'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Anti-abuse:&lt;/strong&gt; One bonus per platform per IP per meme. You can share on all 3 platforms = max +6 points per meme per person.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend: Share Buttons with Effects
&lt;/h3&gt;

&lt;p&gt;Every podium card and grid card gets share buttons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;𝕏 Share&lt;/strong&gt; — opens Twitter intent with pre-filled text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;✈️ Share&lt;/strong&gt; — opens Telegram share dialog&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔗 Copy&lt;/strong&gt; — copies meme URL to clipboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a share earns bonus points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Button gets a &lt;code&gt;shareGlow&lt;/code&gt; animation&lt;/li&gt;
&lt;li&gt;Score bar updates in real-time&lt;/li&gt;
&lt;li&gt;Particle explosion fires&lt;/li&gt;
&lt;li&gt;Score number pops
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;doShare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;memeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;memeUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Open share window&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;shareUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;memeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;memeUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_blank&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Record share &amp;amp; get bonus&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;API&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;?action=share&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;meme_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;memeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;platform&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bonus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;updatePodiumBarShare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;memeId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;spawnParticles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;like&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Open Graph &amp;amp; Twitter Card Meta Tags
&lt;/h2&gt;

&lt;p&gt;The memes page had zero social preview when shared on any platform. We added full OG and Twitter Card tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"$MOTO Meme Contest | Motorcycle Diaries"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Create the best $MOTO memes..."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://motorcyclediaries.fun/images/og-image.jpg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image:width"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"1024"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image:height"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"1024"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:card"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"summary_large_image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:site"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"@motodiariesfun"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"twitter:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://motorcyclediaries.fun/images/og-image.jpg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now when anyone shares &lt;code&gt;motorcyclediaries.fun/memes&lt;/code&gt; on Twitter, Telegram, Discord, WhatsApp — they see a rich preview with title, description, and image.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Dashboard Meme Integration
&lt;/h2&gt;

&lt;p&gt;This was the deepest feature. Connected wallet users can now see their &lt;strong&gt;complete meme activity&lt;/strong&gt; inside their rider dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  API: Enhanced &lt;code&gt;/my&lt;/code&gt; Endpoint
&lt;/h3&gt;

&lt;p&gt;The API now returns comprehensive stats:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"memes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stats"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_likes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_dislikes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_shares"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"top3_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The score uses the unified &lt;code&gt;memeScore()&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;memeScore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$likes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'likes'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$dislikes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'dislikes'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$shares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'shares'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$likes&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$dislikes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$shares&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dashboard: "Your Meme Activity" Card
&lt;/h3&gt;

&lt;p&gt;On the dashboard overview, a new card appears showing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Uploads&lt;/strong&gt; / &lt;strong&gt;Likes&lt;/strong&gt; / &lt;strong&gt;Shares&lt;/strong&gt; counts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total Score&lt;/strong&gt; / &lt;strong&gt;Top 3 Finishes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Thumbnail grid of your uploaded memes (with score overlay)&lt;/li&gt;
&lt;li&gt;Auto-earned &lt;strong&gt;tags and badges&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Earned Tags &amp;amp; Badges System
&lt;/h3&gt;

&lt;p&gt;Based on your meme activity, you automatically earn labels:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Badge&lt;/th&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🖼️ Meme Creator&lt;/td&gt;
&lt;td&gt;Upload 1+ meme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❤️‍🔥 Popular Memer&lt;/td&gt;
&lt;td&gt;10+ total likes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚀 Viral Meme&lt;/td&gt;
&lt;td&gt;50+ total likes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🏆 Top 3&lt;/td&gt;
&lt;td&gt;Reach Top 3 ranking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📤 Share Master&lt;/td&gt;
&lt;td&gt;5+ total shares&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These appear as colored tag pills on the dashboard and activate corresponding badges in the Rewards section.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hero Bar Tag
&lt;/h3&gt;

&lt;p&gt;If you've uploaded any memes, a pink &lt;strong&gt;🖼️ MEME CREATOR&lt;/strong&gt; tag appears next to your wallet address in the dashboard header bar — visible at all times.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memes Tab: Full Stats View
&lt;/h3&gt;

&lt;p&gt;The dedicated Memes tab in the dashboard now shows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Complete stat overview with all metrics&lt;/li&gt;
&lt;li&gt;Grid of all your uploaded memes with per-meme stats (likes, dislikes, shares, score)&lt;/li&gt;
&lt;li&gt;Featured badge indicator on featured memes&lt;/li&gt;
&lt;li&gt;Upload form for new memes (now supports video too)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  6. Improved Navigation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Desktop Sidebar
&lt;/h3&gt;

&lt;p&gt;The sidebar got a significant readability upgrade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Width: &lt;code&gt;180px&lt;/code&gt; → &lt;code&gt;220px&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Font: &lt;code&gt;Orbitron 0.6rem&lt;/code&gt; → &lt;code&gt;Outfit 0.95rem&lt;/code&gt; (~60% larger)&lt;/li&gt;
&lt;li&gt;Icons: &lt;code&gt;0.9rem&lt;/code&gt; → &lt;code&gt;1.15rem&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Better padding and hover states&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mobile Tabs
&lt;/h3&gt;

&lt;p&gt;Mobile navigation tabs were redesigned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Font: &lt;code&gt;0.48rem&lt;/code&gt; → &lt;code&gt;0.75rem&lt;/code&gt; (~56% larger)&lt;/li&gt;
&lt;li&gt;Added emoji icons: 🏠 Dashboard, 🏆 Grand Prix, 🤝 Referral, etc.&lt;/li&gt;
&lt;li&gt;Better borders and active state styling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;display:flex&lt;/code&gt; alignment for icon + text&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Clean URL Routing
&lt;/h2&gt;

&lt;p&gt;Added Apache rewrite rules so all pages work without &lt;code&gt;.html&lt;/code&gt; extensions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="sr"&gt; mod_rewrite.c&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;RewriteEngine&lt;/span&gt; &lt;span class="ss"&gt;On&lt;/span&gt;
    &lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-f
    &lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-d
    &lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME}.html -f
    &lt;span class="nc"&gt;RewriteRule&lt;/span&gt; ^(.+)$ $1.html [L]
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;code&gt;motorcyclediaries.fun/memes&lt;/code&gt; works cleanly instead of requiring &lt;code&gt;/memes.html&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Technical Architecture
&lt;/h2&gt;

&lt;p&gt;Here's the full stack powering the meme contest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend:    Vanilla HTML/CSS/JS (zero frameworks)
Backend:     PHP API with JSON file storage
Storage:     Server filesystem for uploads
Voting:      IP-based (md5 hash), no wallet required
Sharing:     IP + platform tracking
Scoring:     (likes - dislikes) + (shares × 2)
Hosting:     Hostinger shared hosting
CDN:         Cloudflare
Cost:        ~$3/month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why JSON files instead of a database?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a meme contest with hundreds (not millions) of entries, JSON files with &lt;code&gt;LOCK_EX&lt;/code&gt; are simpler, faster to iterate, and require zero database setup. The entire data model fits in one file. When we outgrow it, migrating to SQLite or MySQL is trivial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why IP-based voting instead of wallet-based?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We want maximum participation. Requiring wallet connection just to vote kills engagement. IP-based (one vote per IP per meme) keeps it fair while being frictionless. Wallet connection is only needed for uploading memes.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Weekly automated winner selection and reward distribution&lt;/li&gt;
&lt;li&gt;Meme of the Week auto-feature on social channels&lt;/li&gt;
&lt;li&gt;Enhanced dashboard analytics with graphs&lt;/li&gt;
&lt;li&gt;Community-driven meme categories and tags&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Features shipped today&lt;/td&gt;
&lt;td&gt;7 major&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API endpoints added/updated&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSS animations created&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of code changed&lt;/td&gt;
&lt;td&gt;~800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment cycles&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frameworks used&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total infrastructure cost&lt;/td&gt;
&lt;td&gt;~$3/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Meme Contest:&lt;/strong&gt; &lt;a href="https://motorcyclediaries.fun/memes" rel="noopener noreferrer"&gt;motorcyclediaries.fun/memes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard:&lt;/strong&gt; &lt;a href="https://motorcyclediaries.fun/dashboard" rel="noopener noreferrer"&gt;motorcyclediaries.fun/dashboard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Main Site:&lt;/strong&gt; &lt;a href="https://motorcyclediaries.fun" rel="noopener noreferrer"&gt;motorcyclediaries.fun&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telegram:&lt;/strong&gt; &lt;a href="https://t.me/motodiariesbot?start=join" rel="noopener noreferrer"&gt;@motodiariesbot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X/Twitter:&lt;/strong&gt; &lt;a href="https://x.com/motodiariesfun" rel="noopener noreferrer"&gt;@motodiariesfun&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Upload a meme. Vote on others. Share for bonus points. See your stats on the dashboard.&lt;/p&gt;

&lt;p&gt;Everything is live right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;You don't need React. You don't need Next.js. You don't need a $50K infrastructure budget.&lt;/p&gt;

&lt;p&gt;Sometimes all you need is vanilla HTML, a PHP file, a JSON storage, and the stubborn refusal to stop shipping.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Born to Ride. Forced to HODL. Never stop building.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This is part of the &lt;a href="https://dev.to/motodev"&gt;Motorcycle Diaries Dev Log&lt;/a&gt; series — documenting every step of building a crypto community project from scratch with $0 budget.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>php</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a Crypto Project Alone With $0 — Here's What Happened When I Chose Honesty Over Hype</title>
      <dc:creator>motorcyclediaries.fun</dc:creator>
      <pubDate>Fri, 20 Mar 2026 19:27:50 +0000</pubDate>
      <link>https://dev.to/motodev/i-built-a-crypto-project-alone-with-0-heres-what-happened-when-i-chose-honesty-over-hype-3am2</link>
      <guid>https://dev.to/motodev/i-built-a-crypto-project-alone-with-0-heres-what-happened-when-i-chose-honesty-over-hype-3am2</guid>
      <description>&lt;h2&gt;
  
  
  A Motorcycle Crash, Three Beers, and the Birth of Something Nobody Expected
&lt;/h2&gt;

&lt;p&gt;Most crypto projects start with a whitepaper nobody reads, a team of anonymous "blockchain experts," and a $500K marketing budget aimed at making you believe the next revolution just dropped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$MOTO started with a broken nose in a pub.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me explain.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Man Behind the Helmet
&lt;/h2&gt;

&lt;p&gt;He's 45. He wakes up, works 8 hours, goes home. Repeat. For years.&lt;/p&gt;

&lt;p&gt;No financial freedom. No passive income. Just a decade of searching for something — &lt;em&gt;anything&lt;/em&gt; — that could break the cycle.&lt;/p&gt;

&lt;p&gt;Like millions of others, he found crypto.&lt;/p&gt;

&lt;p&gt;In 2018, he put $100 into Shiba Inu. When it became $4,000, he felt something he hadn't felt in a long time:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hope.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But crypto is a brutal teacher. In the years that followed, he lost money. Many times. He kept watching, learning, trying.&lt;/p&gt;

&lt;p&gt;Then he discovered Solana. Then pump.fun.&lt;/p&gt;

&lt;p&gt;And then he watched — helpless — as 15-year-old kids on the internet mocked people while draining their wallets.&lt;/p&gt;

&lt;p&gt;Something inside him snapped: &lt;em&gt;"I have to do something."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Motorcycle Changed Everything
&lt;/h2&gt;

&lt;p&gt;About a year ago, something unexpected happened. He discovered motorcycles.&lt;/p&gt;

&lt;p&gt;First it was curiosity. Then he joined some riding groups online. Then weekend rides — 2, 3 hours — with a small tent, camping gear, and the quiet company of the road.&lt;/p&gt;

&lt;p&gt;For the first time in years, he felt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Freedom. Friendship. Joy.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The road gave him what the office never could.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Crash That Started It All
&lt;/h2&gt;

&lt;p&gt;Then one day, he crashed his motorcycle.&lt;/p&gt;

&lt;p&gt;Broke his nose.&lt;/p&gt;

&lt;p&gt;Yes, really.&lt;/p&gt;

&lt;p&gt;That evening, we were sitting in a pub. He had three beers, a bag of chips, and a ridiculous bandage on his face. We were laughing about the crash when he suddenly said something that changed everything:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"What if I create my own world for this?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A place where road stories, motorcycle culture, and a community could grow. A digital home for riders, dreamers, and degens. And somehow — maybe even create some financial freedom along the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That night, $MOTO was born.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not in a Silicon Valley boardroom. Not from a VC pitch deck. From a pub, a broken nose, and a man who was tired of watching others take and never give.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Word From the Man Himself
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"I'm right in the middle of this story as the main character. But let's be honest — I'm a guy who sometimes can't even figure out how to use his own phone. LOL. My friend once spent a full hour on the phone trying to walk me through installing a VPN. One. Full. Hour.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So the people who actually make things happen? That's my two real friends.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;One of them writes everything you're reading right now, publishes it, runs all the social media — and prefers to stay anonymous.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The other one is a software engineer and my childhood friend. He built the entire website, the Telegram bot, the verification system, all of it. Every line of code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I owe them more than I can say. Thank you, both of you.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— The guy with the broken nose"&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Actually Built (This Is Where It Gets Wild)
&lt;/h2&gt;

&lt;p&gt;Here's what happens when one man with zero budget, zero coding knowledge, and maximum stubbornness decides to build a crypto project from scratch — with two loyal friends who refuse to let him fail:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Token: $MOTO on Solana
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Blockchain&lt;/td&gt;
&lt;td&gt;Solana (400ms finality, &amp;lt;$0.01 fees)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Launch&lt;/td&gt;
&lt;td&gt;pump.fun — fair launch, no presale, no private sale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Supply&lt;/td&gt;
&lt;td&gt;1,000,000,000 (1 Billion)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Liquidity Pool&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100% BURNED&lt;/strong&gt; — not locked, BURNED. Gone forever.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tax&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0%&lt;/strong&gt; — completely free to trade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team Wallets&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ZERO&lt;/strong&gt; — no hidden allocations, period&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read that again. &lt;strong&gt;100% burned LP. 0% tax. No team wallets.&lt;/strong&gt; In a space where 99% of projects have backdoors, $MOTO has none. The contract is as clean as it gets.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Website: &lt;a href="https://motorcyclediaries.fun" rel="noopener noreferrer"&gt;motorcyclediaries.fun&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Not some template garbage — a full custom-built experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dark glassmorphism design with neon accents&lt;/li&gt;
&lt;li&gt;Interactive gallery with Ken Burns cinematics&lt;/li&gt;
&lt;li&gt;PWA (install it on your phone like an app)&lt;/li&gt;
&lt;li&gt;SEO-optimized down to the last schema tag&lt;/li&gt;
&lt;li&gt;AI-crawler friendly (llms.txt for ChatGPT, Claude, Perplexity)&lt;/li&gt;
&lt;li&gt;Multiple pages: &lt;a href="https://motorcyclediaries.fun/manifesto.html" rel="noopener noreferrer"&gt;Manifesto&lt;/a&gt;, &lt;a href="https://motorcyclediaries.fun/about.html" rel="noopener noreferrer"&gt;About&lt;/a&gt;, Verification Portal&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Telegram Bot: An Entire Ecosystem
&lt;/h3&gt;

&lt;p&gt;This is what blows people's minds. &lt;a href="https://t.me/motodiariesbot" rel="noopener noreferrer"&gt;@motodiariesbot&lt;/a&gt; isn't just a welcome bot — it's a &lt;strong&gt;full-stack community management system&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email Verification Portal&lt;/strong&gt; — New members verify via email before chatting. Custom-built on the website with SPF/DMARC. Zero spam bots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Twitter/X Integration&lt;/strong&gt; — Every post from &lt;a href="https://x.com/motodiariesfun" rel="noopener noreferrer"&gt;@motodiariesfun&lt;/a&gt; is automatically shared with full images and metrics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raid Command Center&lt;/strong&gt; — Start Twitter raids with real-time tracking. Likes, RTs, replies — all displayed live with goal progress bars and motivational hype messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Member Intelligence&lt;/strong&gt; — Name change detection, join tracking, auto-moderation, anti-flood, anti-scam.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily Analytics&lt;/strong&gt; — Google Analytics reports delivered to the group every day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leaderboard System&lt;/strong&gt; — Top raiders, most active members, all tracked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email Database&lt;/strong&gt; — Every verified member's email is stored for future announcements and newsletters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All self-built. Python + FastAPI + SQLite + Cloudflare Tunnels.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tech Stack
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend:     HTML/CSS/JS (no frameworks — raw speed)
Hosting:      Hostinger shared + Cloudflare CDN
Bot:          Python 3 + python-telegram-bot v21
Backend:      FastAPI + Uvicorn
Database:     SQLite (aiosqlite)
Tunneling:    Cloudflare quick tunnels
Email:        PHP mail() + SPF/DMARC
Analytics:    Google Analytics 4 + GA Data API
Cost:         ~$3/month total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Three dollars a month.&lt;/strong&gt; That's the entire infrastructure cost of this project.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Philosophy: Why $MOTO Hits Different
&lt;/h2&gt;

&lt;p&gt;Let's be brutally honest about the meme coin space:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;90% of projects are cash grabs&lt;/li&gt;
&lt;li&gt;Most "teams" are anonymous for a reason&lt;/li&gt;
&lt;li&gt;Paid influencers shill whatever pays the most&lt;/li&gt;
&lt;li&gt;"Community" usually means a Telegram full of bots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;$MOTO flips every single one of those:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero Budget&lt;/strong&gt; — No funding, no investors. Everything built from nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three Friends&lt;/strong&gt; — Not a corporation. Not anonymous devs. A motorcycle crasher and two childhood friends who believe in the ride.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Paid Promoters&lt;/strong&gt; — We wrote an &lt;a href="https://motorcyclediaries.fun/yessir.html" rel="noopener noreferrer"&gt;entire manifesto&lt;/a&gt; about why we refuse every "Sir, I can pump your token" DM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Transparency&lt;/strong&gt; — Yes, we use AI. For code, images, content. And we say it openly. Because in 2026, pretending you don't use AI is the real lie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Radical Honesty&lt;/strong&gt; — The creator publicly says: &lt;em&gt;"This might fail."&lt;/em&gt; When was the last time a crypto project told you that?&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Why You Should Pay Attention
&lt;/h2&gt;

&lt;p&gt;Here's what most people miss:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The crypto space is starving for authenticity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every day, thousands of tokens launch on pump.fun. Most die in minutes. The ones that survive? They have &lt;em&gt;story&lt;/em&gt;. They have &lt;em&gt;community&lt;/em&gt;. They have something that makes people &lt;em&gt;care&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;$MOTO has all three.&lt;/p&gt;

&lt;p&gt;A 45-year-old motorcycle crasher with a bandaged nose, sitting in a pub, dreaming of building something from nothing. His childhood friend writing code late at night. Another friend running the socials and refusing to take credit. Three guys, zero budget, one ridiculous dream.&lt;/p&gt;

&lt;p&gt;This isn't a "100x guaranteed" pitch. This is a guy on a motorcycle saying &lt;em&gt;"I'm going to try, and I'm going to be honest about every step of the way."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And sometimes, those are the stories that surprise everyone.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Budget spent on marketing:&lt;/strong&gt; $0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Influencers paid:&lt;/strong&gt; 0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines of code written:&lt;/strong&gt; 5,000+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rug pull possibility:&lt;/strong&gt; 0% (LP burned)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tax:&lt;/strong&gt; 0%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team allocation:&lt;/strong&gt; 0%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honesty level:&lt;/strong&gt; Maximum&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friends who refused to give up on him:&lt;/strong&gt; 2&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Get In Early. Or At Least Watch the Ride.
&lt;/h2&gt;

&lt;p&gt;Whether you buy $MOTO or just follow the story, here's where to find us:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Website&lt;/td&gt;
&lt;td&gt;&lt;a href="https://motorcyclediaries.fun" rel="noopener noreferrer"&gt;motorcyclediaries.fun&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manifesto&lt;/td&gt;
&lt;td&gt;&lt;a href="https://motorcyclediaries.fun/manifesto.html" rel="noopener noreferrer"&gt;The Full Story&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram&lt;/td&gt;
&lt;td&gt;&lt;a href="https://t.me/motodiariesbot?start=join" rel="noopener noreferrer"&gt;Join via Bot&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X/Twitter&lt;/td&gt;
&lt;td&gt;&lt;a href="https://x.com/motodiariesfun" rel="noopener noreferrer"&gt;@motodiariesfun&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TikTok&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.tiktok.com/@moto_coin" rel="noopener noreferrer"&gt;@moto_coin&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Telegram group requires email verification — because we care more about real people than inflated member counts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Words
&lt;/h2&gt;

&lt;p&gt;I don't know if $MOTO will moon. I don't know if this 45-year-old motorcycle nerd with the crooked teeth and strange helmet will become the next crypto legend.&lt;/p&gt;

&lt;p&gt;But I know this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything here is real.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Everything here is transparent.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;And the road is just getting started.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a world of rugpulls, fake teams, and empty promises — maybe a broken nose, three beers in a pub, and two friends who said &lt;em&gt;"let's do this"&lt;/em&gt; is exactly the origin story crypto needs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Born to Ride. Forced to HODL.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The engine is running. The road is open. The question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are you riding with us?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;$MOTO is a meme coin created for entertainment and community purposes. This is not financial advice. Always DYOR. Never invest more than you can afford to lose. But if you're going to take a chance on something in crypto — why not take it on the one project that's honest enough to tell you it might not work?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>solana</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
