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}
-
-
+ {children}