TL;DR: Solo IDE won Best UI/UX (and a $500 cash prize) at the 2026 Startup Week Buildathon. The win didn't come from tricks — it came from a design system built around OKLCH tokens, shadows instead of borders, and a genuine obsession with what "done" actually means. Three of us, 72 hours, brownfield codebase.
An Award We Didn't Plan For
We entered the Startup Week Buildathon to ship a complete product. I wrote about the technical side of that sprint in the previous post — the agent layer rewrite, the credential vault, the session isolation bug that showed up at 2am. That's the "how does it work" story.
This is the "how does it feel" story.
We won Best UI/UX at the end of the buildathon. A $500 prize and, honestly, the award that meant more to me than the money — because UI/UX in a native desktop app is not easy, and most hackathon projects don't try.
The Native UI/UX Problem
Solo IDE is built on Tauri 2 — a native window with a WebView inside, Rust backend, React frontend. The WebView part is freeing and limiting at the same time. You get all of CSS, animations, React component libraries. But you also inherit all of the "this feels like a website, not an app" problems.
Our design system had to bridge that gap. We built it around three rules:
- Shadows over borders — elevation comes from
box-shadow, never from1px solid. Containers don't have visible borders; they have depth. - OKLCH colors — perceptually uniform, works in both light and dark mode without the colors going muddy or washed out
- GPU-only animations —
transformandopacityonly, always under 200ms, always interruptible
The Problem With Glassmorphism in Light Mode
We designed dark mode first. Frosted glass panels with backdrop-blur-md, semi-transparent card backgrounds (bg-card/95), soft shadows — it looked genuinely good. Then I turned on light mode.
Everything disappeared.
Semi-transparent panels that look elevated and elegant against a dark background just vanish against white. The whole glassmorphism treatment became invisible. The design fully broke.
The fix was a 24-file audit. Every component that had a hardcoded color value or ad hoc opacity got replaced with OKLCH tokens:
/* apps/desktop/src/index.css */
:root {
--background: oklch(0.98 0.005 75); /* warm off-white, not pure #fff */
--card: oklch(0.96 0.004 75); /* slightly elevated from background */
--primary: oklch(0.68 0.17 140); /* Solo Green */
}
html.dark {
--background: oklch(0.16 0.012 60);
--card: oklch(0.19 0.010 60);
--primary: oklch(0.86 0.14 135); /* Solo Mint — lighter for dark bg */
}
OKLCH's L value (lightness) maps consistently to what your eye actually perceives, unlike hex or HSL. If I need a surface to feel 3% more elevated than the background, I add 0.03 to L and it works in both light and dark mode. That predictability is what makes a token system pay off when you're touching 24 files at once.
Rethinking the Sidebar
The sidebar before the hackathon had two separate views: file explorer and repo/git panel. Users toggled between them. It felt like two apps duct-taped together.
The replacement: a unified accordion where every repository section is a collapsible header with its contents below. One layout, no toggling, immediate context.
This sounds simple. It wasn't. The two-panel design had state living locally in each panel — which repo was active, what was expanded, what the worktree context was. The accordion needs a single source of truth. We had to un-tangle per-panel state and re-flow it through a workspace store.
We did this while a concurrent PR was touching worktree state management. Merging those two at 2am involved reconciling competing approaches to the same state problem. I don't recommend it. But the unified sidebar was the right call — it's the kind of thing judges notice immediately, even if they can't articulate why.
The Demo-Day Details
Beyond the big architectural decisions, there were specific things that made Solo feel finished in demo conditions.
The startup experience. When the app opens, there's a 5-second ambient sound with a 3-second fade-out, and a breathing glow animation on the welcome screen. It's not functional. It's intentional. Opening an IDE shouldn't feel like opening a spreadsheet.
Keyboard shortcut overlay. Press ? and a panel slides in listing every shortcut, organized by context. This single feature communicated "considered product" more than any feature list could. Judges see a lot of incomplete-feeling demos. A keyboard shortcut overlay says: we thought about power users.
Font normalization. Before the hackathon, font sizes across the codebase were a mix of hardcoded pixel values, arbitrary rem values, and whatever each component author had used. A single pass converted everything to Tailwind scale tokens (text-xs, text-sm, text-base, text-lg). The visual result was subtle. But "subtle" is the point — when nothing feels visually off, the product feels intentional.
Tab bar capsules. Instead of the standard underline tab indicator, we used a pill/capsule treatment with a soft background. Small difference. But small differences compound.
Completeness Is a Feature
There's a version of Solo we could have submitted that was technically impressive but felt unfinished. Half the UI in light mode. Some interactions missing transitions. Flows that worked but felt rough.
People feel "unfinished" from across a room. Not because they can name what's wrong — because something keeps catching their eye that isn't quite right. That accumulated friction is what makes judges put something down.
My internal metric for demo day: if a judge picked up Solo and used it as their actual IDE for 30 minutes, what breaks or feels wrong? We went through that list and fixed everything on it.
Brownfield hackathons give you a head start here. We had a working terminal, editor, file explorer, and AI agent before the clock started. The 72 hours went toward making everything coherent — the design system, the accordion sidebar, session scoping, the voice I/O pipeline. Not toward setting up boilerplate.
What 50-60 Hours Looks Like
There's a point around hour 40 where you're debugging a text-to-speech stop-button race condition at midnight — the button was reverting the UI state before the audio actually finished playing, because AudioContext.close() is async and we weren't awaiting it — and the temptation to ship "good enough" is genuinely strong.
We didn't. We fixed the race condition. We ran the light mode audit. We normalized the fonts. We added the startup sound. We built the keyboard overlay.
That's the work. The $500 and the award are what you get when you don't stop at "good enough."
I'm finishing my MS in Computer Science at NYU and looking for full-time engineering roles. Three days, a brownfield codebase, Rust backend, TypeScript agent bridge, React frontend, and a design system that won an award — that's the clearest proof I have that I can ship real things under real pressure.
Solo IDE was built at the 2026 Startup Week Buildathon with Tanish Rana and Adamay Mann. It won Best UI/UX. If you're building a native app with a WebView and want to talk design systems or Tauri architecture, I'd like to hear from you.