DEV Community

Cover image for Surviving 3 Years of Solo Dev: How I built a "Culture OS" and migrated to Web3.
Ko Takahashi
Ko Takahashi

Posted on

Surviving 3 Years of Solo Dev: How I built a "Culture OS" and migrated to Web3.

My Git commit history looks like a crime scene.

For the past three years, I have been a solo developer possessed by a single idea: to build a "Culture OS" that digitizes and preserves the fading spiritual essence of Japan.

I coded everywhere. In Tokyo cafes at 3 AM, on bullet trains, locked in my room for days. The result of this obsession is a digital monolith that I built with my own hands:

Over 400,000 lines of code.

This is the story of that massive Web2 architecture, why it hit a wall, and why I decided to bridge it into the chaos of Web3 using Solana.

The "Insane" Web2 Monolith

Building solo means you have to choose boring, reliable technology. You don't have a DevOps team to fix things at midnight. You are the team.

Here is the stack that powered those 400k lines:

  • The Brain (Backend): Python & Django. It’s robust, opinionated, and the ORM is a lifesaver when managing complex cultural data models.
  • The Face (Frontend): Next.js & TypeScript. Essential for SEO and providing the snappy, app-like experience users expect.
  • The Plumbing: PostgreSQL for the DB, Docker for containerization, deployed via Vercel and Railway.

The system works beautifully. It handles complex user authentication, content management, and booking systems.

As an engineer, I was proud of this fortress. But as a founder, I realized something was missing.

The Wall: Why standard databases weren't enough

I was building a platform for "Matsuri" (Festival) — a concept rooted in community energy and shared experience.

My Django app could manage users perfectly. But a users table in PostgreSQL cannot store enthusiasm. It cannot store ownership.

I realized that modern Japan had become like a "well-crafted theme park" — beautiful but passive. My app was just digitalizing that theme park. Users were visitors, not participants.

To revive the true spirit of "Wa" (Harmony), I needed the community to have real skin in the game. I needed a way to quantify and transfer value and gratitude seamlessly without relying on clunky centralized payment processors for every micro-interaction.

The architecture had to evolve from a Monolith to an Ecosystem.

Why Solana? (The Engineering Choice)

I decided to integrate Web3. I looked at Ethereum, L2s, and various alt-L1s.

I chose Solana for three purely pragmatic engineering reasons based on the user experience I needed:

  1. Latency (Speed): My users are used to the instant gratification of Web2. Waiting 15 seconds (or minutes) for block finality is a non-starter for a consumer app. Solana’s 400ms block times feel essentially instant.
  2. Cost (Micro-transactions): I want users to feel like they are tossing a 5-yen coin into a shrine offering box. If the gas fee is $5, the magic dies. Solana fees are negligible.
  3. The Vibe (Developer velocity): The ecosystem felt hungry and driven to ship code. The tooling (Rust/Anchor) is tough but robust.

The Architecture: The Hybrid Approach

I didn't throw away my 400,000 lines of code. I wasn't going to rewrite complex business logic in Rust smart contracts unnecessarily.

Instead, I adopted a Hybrid Architecture.

  • Django remains the source of truth for user profiles and content data.
  • Solana becomes the layer for value transfer, ownership, and community incentives.

The challenge is bridging them. How does my Python backend trust that a user owns a specific Solana wallet?

The Implementation Flow (Simplified)

We used the standard message-signing flow to link Web2 and Web3 identities without relying on a centralized auth provider.

  1. Frontend (Next.js): The user connects their Phantom wallet using @solana/wallet-adapter-react.
  2. Signing: The frontend requests the user to sign a specific message (e.g., "Login to Matsuri OS: [timestamp]").
  3. Verification (Backend): The frontend sends the wallet address and the signed message to my Django API.
  4. Python Logic: The backend uses a Solana Python library to verify that the signature was indeed created by that wallet address.
  5. Linking: If valid, Django links that wallet address to the user's user_id in Postgres.
// A glimpse of the frontend integration in Next.js
import { useWallet } from '@solana/wallet-adapter-react';
import { WalletMultiButton } from '@solana/wallet-adapter-react-ui';

const MatsuriHeader = () => {
    const { publicKey, signMessage } = useWallet();

    const handleVerify = async () => {
        // Logic to sign message and send to Django API
        if (!publicKey || !signMessage) return;
        const message = new TextEncoder().encode(`Login to Matsuri: ${Date.now()}`);
        const signature = await signMessage(message);
        // Send signature & publicKey to backend...
    };

    return (
        <nav>
            <h1>Culture OS</h1>
            <WalletMultiButton /> {/* The magic button */}
        </nav>
    );
}; 
Enter fullscreen mode Exit fullscreen mode

Launching "Matsuri Coin" (MTR)

Last week, I finally deployed the token to the mainnet. Moving from writing logic to building an economy was a paradigm shift.

It's not just a token; it's the fuel designed to flow through those 400,000 lines of code, turning passive users into active community members.

The coding journey was lonely, but the next phase cannot be done solo. I am now building the Global Community Friends (GCF), a structure to govern this new ecosystem.

The 400,000 lines were just the foundation. The real architecture is the community we build on top of it.

If you are a developer interested in:

Real-world hybrid architectures (Web2 + Web3) instead of pure speculation.

The intersection of ancient culture and bleeding-edge tech.

Managing massive solo codebases.

Let's connect on Contact Page. I'm looking for engineers who want to dive into this chaos with me.

Top comments (0)