From d824f877edb7f72a54fb4584699b2e4cfd0d1e43 Mon Sep 17 00:00:00 2001 From: luinbytes <42706009+luinbytes@users.noreply.github.com> Date: Mon, 31 Aug 2026 11:09:49 +0100 Subject: [PATCH 1/5] feat: add three interactive portfolio concepts --- README.md | 20 +- app/concepts/signal-desk/page.tsx | 11 + app/concepts/signal-field/page.tsx | 11 + app/concepts/trace/page.tsx | 12 + app/layout.tsx | 23 +- app/page.tsx | 4 +- .../concepts/concept-gallery.module.css | 179 +++ components/concepts/concept-gallery.tsx | 133 ++ .../signal-desk/signal-desk.module.css | 692 ++++++++++ .../concepts/signal-desk/signal-desk.tsx | 313 +++++ .../signal-field/signal-field.module.css | 762 +++++++++++ .../concepts/signal-field/signal-field.tsx | 380 ++++++ components/concepts/trace/trace-portfolio.tsx | 481 +++++++ components/concepts/trace/trace.module.css | 1186 +++++++++++++++++ components/layout/site-frame.tsx | 28 + docs/portfolio-mvps/README.md | 30 + .../screenshots/signal-desk-desktop.png | Bin 0 -> 882943 bytes .../screenshots/signal-desk-mobile.png | Bin 0 -> 303573 bytes .../screenshots/signal-field-desktop.png | Bin 0 -> 215749 bytes .../screenshots/signal-field-mobile.png | Bin 0 -> 45489 bytes .../screenshots/trace-desktop.png | Bin 0 -> 288292 bytes .../screenshots/trace-mobile.png | Bin 0 -> 163965 bytes lib/portfolio-content.ts | 82 ++ public/sitemap.xml | 38 +- scripts/generate-sitemap.js | 3 + tests/browser/browser_test.py | 102 +- 26 files changed, 4447 insertions(+), 43 deletions(-) create mode 100644 app/concepts/signal-desk/page.tsx create mode 100644 app/concepts/signal-field/page.tsx create mode 100644 app/concepts/trace/page.tsx create mode 100644 components/concepts/concept-gallery.module.css create mode 100644 components/concepts/concept-gallery.tsx create mode 100644 components/concepts/signal-desk/signal-desk.module.css create mode 100644 components/concepts/signal-desk/signal-desk.tsx create mode 100644 components/concepts/signal-field/signal-field.module.css create mode 100644 components/concepts/signal-field/signal-field.tsx create mode 100644 components/concepts/trace/trace-portfolio.tsx create mode 100644 components/concepts/trace/trace.module.css create mode 100644 components/layout/site-frame.tsx create mode 100644 docs/portfolio-mvps/README.md create mode 100644 docs/portfolio-mvps/screenshots/signal-desk-desktop.png create mode 100644 docs/portfolio-mvps/screenshots/signal-desk-mobile.png create mode 100644 docs/portfolio-mvps/screenshots/signal-field-desktop.png create mode 100644 docs/portfolio-mvps/screenshots/signal-field-mobile.png create mode 100644 docs/portfolio-mvps/screenshots/trace-desktop.png create mode 100644 docs/portfolio-mvps/screenshots/trace-mobile.png create mode 100644 lib/portfolio-content.ts diff --git a/README.md b/README.md index e03013f..710f2d4 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,16 @@ # luinbytes.dev -Lu's personal portfolio: software built from annoying gaps, shipped as useful tools. +Lu's personal portfolio, currently presented as three fully built interactive directions for review. -The homepage keeps the personal intro up front, then gives [HomeBot](https://github.com/luinbytes/HomeBot) its own feature section. The rest of the work stays in the build index and dedicated case pages. +The homepage is a comparison gallery. Each concept reframes the site around Lu, his current work at [Orchid.ai](https://orchid.ai), and a curated group of public repositories rather than a catalogue of product pages. ## What is featured -HomeBot is an open-source Rust desktop, server, and Android home for persistent AI teammates. It keeps authenticated chats, tools, routines, and repository workspaces server-owned while native desktop and Android clients share the same state. +- `/concepts/signal-desk` — a warm, tactile studio patchbay with animated repository channels. +- `/concepts/trace` — a bold editorial identity with a native range-driven project scrubber. +- `/concepts/signal-field` — a spatial topographic map with plotted repository routes and a list-view fallback. -- [Source repository](https://github.com/luinbytes/HomeBot) -- Current status: pre-v1 development - -The homepage's retained build index also covers: - -- [Linux Sonar](https://github.com/luinbytes/linux-sonar) — per-app PipeWire routing, ChatMix, and mic effects for Linux. -- Meteor — local-first Android tasks and habits. -- Sleepr — cycle-aware wake guidance and on-device sleep rhythm learning. -- Game Systems — overlays, hooks, trainers, and runtime instrumentation. - -Dedicated case pages cover BallHammer, Risk of Anticheat, BrcTrainer, DaggerFall, and SuperHackerGolf. +All three feature [HomeBot](https://github.com/luinbytes/HomeBot), [rakazo-android](https://github.com/luinbytes/rakazo-android), [Linux Sonar](https://github.com/luinbytes/linux-sonar), [bongocat](https://github.com/luinbytes/bongocat), [cursor-barrier](https://github.com/luinbytes/cursor-barrier), and [BallHammer](https://github.com/luinbytes/BallHammer). Existing case-study routes remain available as an archive while a final direction is selected. ## Stack diff --git a/app/concepts/signal-desk/page.tsx b/app/concepts/signal-desk/page.tsx new file mode 100644 index 0000000..989466d --- /dev/null +++ b/app/concepts/signal-desk/page.tsx @@ -0,0 +1,11 @@ +import type { Metadata } from "next"; +import { SignalDesk } from "@/components/concepts/signal-desk/signal-desk"; + +export const metadata: Metadata = { + title: "Signal Desk | Lu portfolio concept", + description: "A tactile, interactive portfolio concept for Lu's work at Orchid.ai and in open source.", +}; + +export default function SignalDeskPage() { + return ; +} diff --git a/app/concepts/signal-field/page.tsx b/app/concepts/signal-field/page.tsx new file mode 100644 index 0000000..709b05d --- /dev/null +++ b/app/concepts/signal-field/page.tsx @@ -0,0 +1,11 @@ +import type { Metadata } from "next"; +import { SignalField } from "@/components/concepts/signal-field/signal-field"; + +export const metadata: Metadata = { + title: "Signal Field | Lu portfolio concept", + description: "A spatial, interactive portfolio concept for Lu's work at Orchid.ai and in open source.", +}; + +export default function SignalFieldPage() { + return ; +} diff --git a/app/concepts/trace/page.tsx b/app/concepts/trace/page.tsx new file mode 100644 index 0000000..951a38b --- /dev/null +++ b/app/concepts/trace/page.tsx @@ -0,0 +1,12 @@ +import type { Metadata } from "next"; +import TracePortfolio from "@/components/concepts/trace/trace-portfolio"; + +export const metadata: Metadata = { + title: "Trace | Lu", + description: + "Lu's interactive portfolio: software engineering, open-source systems, and useful weird little tools.", +}; + +export default function TracePage() { + return ; +} diff --git a/app/layout.tsx b/app/layout.tsx index 6435b73..b1dd8a2 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,10 +1,7 @@ import type { Metadata } from "next"; import { Pixelify_Sans, Space_Grotesk, Space_Mono } from "next/font/google"; import "./globals.css"; -import { Header } from "@/components/layout/header"; -import { Footer } from "@/components/layout/footer"; -import { CommandMenu } from "@/components/command-menu"; -import { CaseInterfaceOverlay } from "@/components/case-interface-overlay"; +import { SiteFrame } from "@/components/layout/site-frame"; import { siteUrl } from "@/site.config"; const spaceGrotesk = Space_Grotesk({ @@ -34,13 +31,13 @@ export const metadata: Metadata = { template: "%s | Lu", }, description: - "Self-taught software engineer building Android apps, Linux tools, game mods, Raycast extensions, and open-source utilities.", + "Lu is a software engineer at Orchid.ai building agents, native Android experiences, Linux tools, and open-source utilities.", metadataBase: new URL(siteUrl), twitter: { card: "summary_large_image", title: "Lu | Software Engineer", description: - "Self-taught software engineer building Android apps, Linux tools, game mods, Raycast extensions, and open-source utilities.", + "Software engineer at Orchid.ai building agents, Android experiences, Linux tools, and open-source utilities.", creator: "@luinbytes", images: `${siteUrl}/share-cards/luinbytes-dev-pink-print.png`, }, @@ -50,7 +47,7 @@ export const metadata: Metadata = { url: siteUrl, title: "Lu | Software Engineer", description: - "Self-taught software engineer building Android apps, Linux tools, game mods, Raycast extensions, and open-source utilities.", + "Software engineer at Orchid.ai building agents, Android experiences, Linux tools, and open-source utilities.", siteName: "Luinbytes", images: [ { @@ -105,8 +102,8 @@ export default function RootLayout({ ║ b) Lu debugging something I broke (sorry) ║ ║ c) A recruiter snooping for code quality (it's good!) ║ ║ ║ - ║ Ink-and-paper system. Proof loop interface. ║ - ║ Hard frames, print marks, preserved details. ║ + ║ Three portfolio directions. Pick your favourite. ║ + ║ The old case-study routes are still tucked underneath. ║ ║ ║ ╚═══════════════════════════════════════════════════════════╝ */} @@ -128,19 +125,13 @@ export default function RootLayout({ suppressHydrationWarning > - - Skip to content -
-
- {children} -
-