cho.sh
2,244 notes
Liked on XI made a mistake. When Jack and I decided to organize this $100K Hackathon, my biggest concern was cheating. Unlike a regular hackathon, everyone participates from home. And because the winner is whoever makes the most PROFIT (not revenue), there are so many ways to manipulate the numbers. So I added a $99 entry fee. One thing I’ve learned from building businesses is that people tend to be more committed when they pay for something. I thought it would filter out spam, attract serious builders, and make the competition fairer for everyone. But I completely missed the other side. 3 years ago, I was a living with my apps. Today, I’m financially free. My life changed so much that somewhere along the way, I lost perspective on what $99 means to someone else. For someone in India, someone struggling to pay their bills, or someone trying to make their first dollar online, $99 can be a lot of money. And those are exactly the people I want to help! I’ve spent years sharing what I’ve learned, reviewing random people’s landing pages, and organizing free meetups around the world. Not because there’s money to make, but because I genuinely love seeing people build things and succeed. And somehow, I was so focused on keeping cheaters out that I didn’t realize I was also keeping genuine builders out. That’s my mistake. So I’ve decided to make the $100K Hackathon completely FREE :) Everyone who already paid got a full refund. I’m still worried about cheating. That problem hasn’t disappeared, and Jack and I will have to figure out better ways to verify profits and keep the leaderboard fair. But that’s our problem to solve. Thank you to everyone who shared their thoughts. Sometimes you need people to remind you of things you’ve forgotten. I genuinely hope this hackathon changes someone’s life. ❤️Liked on XIt’s time to bring back Cafe CursorPosted on Xyo @pendev i can't live share edit a .pen file? it's the most needed featurePosted on XI'm coining a word "Agentsplaining" Agents condescendingly assuming the user don't know fuck and repeating the obviousReplied on X@jayhxmo @raycast Hard to explain. It's the small detailsPosted on X@raycast iOS keyboard is insanely good. Might resub Raycast pro just cuz of thisReplied on X@ishuagra02 I saw a theory that F5.2 is a post train of 5.1, but O5.5 is a distillation of F5.5(unreleased new pretrain) and thats why O5.5 > F5.2Liked on X@anaclumos don't know what is actually improved 👀Posted on Xam i the only one underimpressed with 5.2 fableReplied on X@bvvst great minds think alike https://t.co/YRFWhb1mcOLiked on XClaude Fable 5.2 is out and it's the perfect time to run this god-level prompt on your codebase: "I want you to audit our codebase, is anything here unnecessary, overly complicated in our current setup, or based on weak assumptions? Challenge them. - What can be deleted entirely? - What can be simplified now that unnecessary pieces are gone? Then make the changes. Prefer deleting over simplifying, simplifying over optimizing, and optimizing over automating. This product is being used by thousands of customers, do not cut any corners." This prompt is one I run often and leads to the best results.Replied on X@akshayadinesh19 @bot can we please BYOM for botsLiked on XTo be fair, the Chinese models have a much lower refusal rateLiked on XF*CK IT, im creating a library of AI slop indicators. my feed is full of taste larpers. stay tuned https://t.co/5Muv8nQRm3Liked on XJENSEN! THATS NOT WHAT WE MEANT BY CHINESE MODELS!!!!!!!Liked on Xmy parents had to declare bankruptcy when I was a kid, so they had every reason to pressure me towards a more stable career path instead, they were so patient with me, even as i failed startup after startup for years so getting to tell my mom that everything turned out okay was a really special moment :) for those who can't read Korean, her first message roughly translates to: "Really!!! Congratulations my son. So much :') Thank you God!" i know I've been posting about my exit for like a week now, but it really is a big deal for me and my family! i'll share more about how this all happened and some tactical advice later this week, but for now i'm just riding out all the emotions to quote my mom, thank you God!!!!Liked on X@thefarmers_Dog it stands for Egg GzampleLiked on X🦍 Introducing Memorilla: memory as a modality for LLMs Memorilla turns everything a frozen LLM needs to remember into just 16 memory embeddings ⚡ It uses up to 4,212× fewer tokens and is 27× faster than full context inference while more accurate 🎯 Pushes the Pareto frontier over RAG and agentic memory in personalization, long-document and knowledge QA A thread 🧵:Liked on XThere's a huge product opportunity downstream of Tailscale etc too. At @tldraw we've started designing for "high trust networks" and it's been a beautiful thing. 1. Features that would be a nightmare on the internet are okay on my computer and mostly okay on private networks. Websites that execute user-generated scripts, control production systems, allow for users to send desktop notifications, spend tokens, or directly prompt my agent. Crazy stuff that would only make sense if everyone was in a committed polycule. 2. When everyone on the server can be trusted to have _external_ reasons for good behavior (eg keeping their job, or maintaining friends, family, church, mafia org), the software can be designed in a default social way. Most apps default to isolation, low horizontal visibility, highly restricted collaboration. Makes sense if the social contracts are inside of the app, but if you can trust that they live outside of the app then you can get wild. Example being small group chat names as an emergent comedy phenomenon because anyone in the group can change the name. 3. This can work for commercial products, too, not just internal stuff. Security matters more than ever but the way we've seen that manifest is that more companies are more confident in their own solutions than anything we could provide, to the point where owning data and access is a better value proposition than having it managed. Always has been true for big companies but now even small companies can get a good secure network set up pretty easily, and the hooks we need to build are easy enough. tldraw offline got us started down this road (and shout out to @pendev for first introducing me to the idea of desktop + mcp). We've been bringing that product to private networks and it's been exciting to see how much we can get away with. Keep an eye outReplied on X@saradu birds eye viewLiked on XApplications close in 2 days!! If you have a cool bio idea, and $5-10k will go a long way for you, please apply!!! https://t.co/NCvmrNC53cLiked on XWe've been early adopters of Rust since 2018 and a lot of our infra, voice tech, and even some of the current client is already Rust, the holy grail was getting the whole client there. That means Electron goes away, and so does React Native, mobile keeps native UI but shares app code with desktop via Rust. We hope to get it into testing with users soon™. (And it's not Tauri, it's GPUI, so good guess everyone.) Alright, back to staring at the WoW Forever login screen.Reposted on XOh boy. https://t.co/X7SSskGuGvLiked on XRIP .si domain squatters
SEOCHO Stack (2025)

SEOCHO Stack (2025)

Warning

Over a year old. May be outdated

Background

I don't fit the usual boxes. That's fine. The operating mode here is ship fast with parts you can swap.

  • I'm not optimizing for status or niches. I'm optimizing for clarity, ergonomics, and hot-replaceability.
  • Labels don't ship product. Decisions do.

Red Queen's Race

Everything changes, including your own reasoning. Plan for it.

  • Assume you'll be wrong soon. Prove yourself wrong on purpose and on schedule.
  • Design for swap-outs. Every module is a part you can replace without drama.
  • Prefer learning loops over sunk-cost loyalty. When the world shifts, you shift.
Instagram's Engineering Philosophy (2011)
  1. Keep it very simple
  2. Don't reinvent the wheel
  3. Go with proven and solid technologies when you can

Use 1 and 2 by default. Use 3 only when "proven" also means ergonomic, portable, and easy to replace. New tools exist for reasons. Learn the reason before you commit.

Working rules

  1. Keep it very simple.
  2. Don't reinvent the wheel.
  3. Keep things hot-replaceable.
    • Experiment freely, but keep a revert within one PR.

Definition: hot-replaceable

Swappable in a button press or single PR. Minimal glue, minimal fallout. Interoperable is close, but hot-replaceable is stricter.

Ergonomics Over Anything

Your scarcest resource is energy and a few market windows. Pick tools that reduce friction.

  • No config tax. Things should work out of the box.

    • TypeScript runtime? Use Bun and skip tsconfig loader gymnastics.
    • CJS/ESM headaches? Use runtimes that run both without fuss (again, Bun).
    • Python packaging drift? Use uv for lockable, auto-managed deps.
    • Heavy bundler ceremony? Use Vite or a framework that hides it well.
    • Tools that need bespoke storybook files or boilerplate? Prefer auto-discovery.
    • Hand-rolled Dockerfiles/Terraform for every tweak? Prefer Nix/Nixpacks when possible.
  • Declarative > imperative. Describe what, not how.

  • If it's solvable in 5 lines, don't write 100.

Simple & Elastic > Clever Busywork

Be clear, not clever.

  • Favor elastic but replaceable over stable but sticky, only if you can swap fast.
  • A tiny script that ships beats a baroque "platform."
  • Prefer small, explicit modules you can replace over ornate abstractions you can't.

Use SaaS, Until You Have to Study It

Buy the SLA, rent the complexity.

  • Deep SaaS is great when it does one thing well behind simple HTTP.
  • Avoid proprietary dialect trap unless it's a de-facto standard.
  • Prefer OSS when viable, and self-host if data control or bulk export matters.

Rules of Thumb

  • Simple HTTP in / webhook out → good (hot-replaceable).
  • Custom DSL or deep proprietary surface → risky, avoid unless standard.
  • Own your data, and make export and migration easy.

Examples

Service✅ Fine❌ Not fine
-style HTTPacceptable
Zapieruntil webhooksbeyond that (too much study)
BigQuerycommodity SQLdeep dialect, if you'll need portability

Bias

OSS + self-hosting ⇒ you control the data ⇒ bulk export ⇒ easier swap-outs

Occam's DollarShaveClub

Pick the least-work approach that safely ships.

Implementation Ladder

  1. HTML
  2. CSS
  3. ECMAScript
  4. Pure React
  5. A framework (Next/Remix/etc.)
  6. If it's < 1 hour to build safely, build it
  7. Only then reach for an NPM library

Tooling Ladder

  1. Git
  2. GitHub
  3. GitHub Apps/Actions
  4. Then anything else

IRL Defaults

  • Native <input type="date"> > custom pickers
  • CSS animations > heavy JS animation libs
  • fetch > Axios
  • React Suspense > hand-rolled loading logic
  • RSC > client library fetch
  • GitHub Actions > external CI (unless there's a strong reason)

Deviate from the ladder only for a real, provable ergonomics win.

Engineering Philosophy (Server-First & Type-Safe)

The best code is no code. The second best uses platform capabilities directly, with strong types, clear boundaries, and server-first data access.

Server-First Architecture

Do NOT fetch on the client if the server can fetch.

❌ Wrong (client fetch):

tsx
"use client";
export function BadComponent() {
  const [data, setData] = useState(null);
  useEffect(() => {
    fetch("/api/data")
      .then((r) => r.json())
      .then(setData);
  }, []);
  return <div>{data}</div>;
}

✅ Right (server fetch):

tsx
// Server component
export async function GoodComponent() {
  const rows = await db.select().from(table);
  return <div>{rows.length}</div>;
}

Type Safety Without Compromise

Never use any. Ever. Infer from sources of truth.

  • inferred types: typeof auth.$Infer.Session
  • Elysia + Eden Treaty or Hono Stacks for type-safe API clients
  • Infer DB types from Drizzle schemas

Use Platform Features, Not Libraries

Prefer first-party plugins and capabilities over custom wrappers.

❌ Wrong (custom billing API when a plugin exists):

ts
export const billingApi = new Elysia({ prefix: "/billing" }).post(
  "/create-checkout-session",
  async () => {
    /* ... */
  },
);

✅ Right (Better Auth's Stripe plugin):

ts
await client.subscription.upgrade({
  plan: "pro",
  successUrl: "/dashboard",
  cancelUrl: "/pricing",
});

Direct Over Indirect

From server code, hit the DB directly instead of hopping through your own HTTP.

❌ Wrong:

tsx
const response = await fetch(
  `${process.env.NEXT_PUBLIC_URL}/api/v1/campaigns/${id}`,
);
const campaign = await response.json();

✅ Right:

tsx
const [campaign] = await db
  .select()
  .from(campaigns)
  .where(eq(campaigns.id, id))
  .limit(1);

Performance is Not Optional

  • Parallelize independent work (Promise.all)
  • Cache intentionally (framework cache directives, HTTP cache, etc)
  • Avoid waterfalls
  • Use RSC to minimize client JS

Technology-Specific Guidance

Better Auth

  • Use server helpers (getSession, listOrganizations) on the server only
  • Don't call client methods from the server
  • Prefer built-in plugins (Stripe, Organization)
  • Use referenceId for multi-tenant boundaries

Elysia & Eden Treaty

  • Eden Treaty for typed client ↔ server calls
  • Narrow error types and check before accessing data
  • Keep handlers tiny and composable

Database (Drizzle)

  • Schema is the source of truth. Infer types from it
  • Don't re-add fields already provided by plugins
  • Use relations & indexes, and limit 1 on single-row fetches

UI Components

  • Use shadcn/ui (already installed)
  • Use Sonner for toasts (not inline status messages)
  • Server components by default, client components only when necessary
  • Fetch Data Inside Component, instead of prop drilling
    • They'll be optimized with Partial Prerendering

Anti-Patterns

  1. Client-side fetching in a server-rendered app
  2. Duplicating functionality provided by Better Auth/Stripe/etc.
  3. Ignoring TS errors (no @ts-ignore to make it pass)
  4. Building abstractions before you need them
  5. Fetching without a caching strategy

Code Review Checklist

  • No any types
  • No client fetches for server-available data
  • No duplicate re-implementations of platform features
  • All TypeScript errors resolved
  • Server hits DB directly when applicable
  • Proper error handling with type-narrowing
  • Toasts via Sonner (not inline)
  • Parallelized data fetching where possible
  • Server components by default

The Stack (hot-replaceable by default)

  • Moonrepo
    • Minimal setup, great for multilingual Monorepos
    • Multilingual ⇒ interoperable/hot-replaceable
  • Bun
    • Fast, light, understands TS natively
    • No config thrash, tsconfig purely for editor tooling
  • Elysia (+ Hono where Web-Standard routing/edge is ideal)
    • Simple, ergonomic, fast
    • Elysia feels familiar to Express, Hono hugs web standards
    • Elysia's Eden Treaty and Hono's RPC are type-safe clients-server contracts. Ergonomic.
  • Better Auth
    • Minimal setup, great plugin surface (Stripe, Organization)
    • Server-first helpers, typed end-to-end
    • You own the data. Hot-replaceable.
  • Drizzle ORM + Postgres
    • Schema-first, typed queries, simple migrations
    • Postgres is boring-great
    • Again, you own the data. Hot-replaceable.
  • Biome
    • Lint + format in one, fast, low config
  • AWS via
    • Vercel-like ergonomics, AWS under the hood
    • Hot-replaceable: mostly ergonomic wrappers over AWS APIs
    • Pair with Nixpacks for painless images
  • HTTP-only cookie auth + typed REST (or Eden Treaty RPC)
    • Keep tokens off localStorage, keep surface small & typed
  • shadcn/ui + Sonner
    • Copy-in components (hot-replaceable), great DX for toasts
  • Vitest/Jest/Bun
    • Similar APIs, pick per project needs
  • Automation
    • GitHub Actions for CI
    • Lefthook (or plain git hooks) for visible, simple commit hooks

Skeptical but pragmatic

  • Vercel & Next.js
    • Don't love the occasional rebranding/overrides, but: ergonomic.
    • Use server components, cache directives, and route handlers well.
  • SWR / TanStack Query
    • Use only when you must fetch on the client. Server-first otherwise.
  • Prisma
    • Fine, but Drizzle keeps types closer to SQL and feels lighter.
    • If mixing: isolate behind a repository layer for hot-swap potential.

What I usually avoid unless necessary

  • Docker (hand-rolled everywhere)
    • Docker is imperative in the inside.
    • Use Nixpacks or equivalents to avoid yak-shaving.

And try out that new hot thing in town

Let's say after 2 months, there's a new hot library in town. Should I stay uncool? I'd say: take a leap of faith, but with a parachute. Try unreliable but high-leverage ideas, wrapped in interoperable, hot-replaceable, type-safe modules.

Summary

  • Be clear.
  • Be direct.
  • Be type-safe.
  • Be Server-first.
  • Be library power-user.
  • Be a shipper, not an architect.
Backlinks1