Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Lu's interactive personal portfolio, built around the living pixel pond version of Signal Desk.

The homepage focuses on Lu's current work at [Orchid.ai](https://orchid.ai), selected public projects, and an interactive procedural pond rather than a catalogue of product pages.
The homepage focuses on Lu's selected public projects and an interactive procedural pond rather than a catalogue of product pages.

The site has three public routes: `/`, the interactive portfolio; `/pip`, a static product page for Pip, Lu's warm, easygoing Telegram agent; and `/privacy`, a short personal-use privacy policy. The Pip page is a deliberate standalone exception to the portfolio's homepage-first structure. Retired concept and product URLs resolve to the pond-themed 404 instead of preserving stale copies of older portfolios.

Expand Down
4 changes: 2 additions & 2 deletions app/routes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export type SiteRoute = {
const homeMetadata: RouteMetadata = {
title: "Lu | Software Engineer",
socialTitle: "Lu | Software Engineer",
description: "Lu makes stubborn software behave: Orchid.ai's native Android app, agent systems, Linux tools, and practical software.",
description: "Lu makes stubborn software behave: native Android apps, agent systems, Linux tools, and practical software.",
socialDescription: "I make stubborn software behave. Native Android, agent systems, Linux tools, and practical software.",
canonical: siteConfig.siteUrl,
image: `${siteConfig.siteUrl}/share-cards/luinbytes-dev-pond.png`,
Expand Down Expand Up @@ -88,7 +88,7 @@ export function RouteHead({ route }: { route: SiteRoute }) {
<>
<title>{metadata.title}</title>
<meta name="description" content={metadata.description} />
<meta name="keywords" content="Software Engineer,Next.js,TypeScript,Android,Kotlin,Orchid.ai,AI Agents,HomeBot,Rakazo,Linux,PipeWire,CLI Tool,Open Source" />
<meta name="keywords" content="Software Engineer,Next.js,TypeScript,Android,Kotlin,AI Agents,HomeBot,Rakazo,Linux,PipeWire,CLI Tool,Open Source" />
{metadata.noindex && <meta name="robots" content="noindex" />}
<link rel="canonical" href={metadata.canonical} />
<meta property="og:type" content="website" />
Expand Down
2 changes: 1 addition & 1 deletion components/concepts/signal-desk/profile-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ export function ProfileCard({ reducedMotion, compact = false }: { reducedMotion:
</span>
</span>
<span className={styles.profileStatus}>
<span>Android at Orchid.ai</span>
<span>Software engineer</span>
</span>
</span>
</div>
Expand Down
4 changes: 0 additions & 4 deletions components/concepts/signal-desk/project-explorer.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,6 @@
object-fit: cover;
}

.mediaorchidandroid > img {
object-position: center;
}

.mediarakazoandroid {
background:
radial-gradient(ellipse at 50% 45%, color-mix(in srgb, var(--site-surface-soft) 72%, var(--site-accent) 12%), transparent 58%),
Expand Down
9 changes: 4 additions & 5 deletions components/concepts/signal-desk/signal-desk.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ function SiteFooter({ reduced, entrance, ready }: { reduced: boolean; entrance:
<div>
<a href={portfolioIdentity.github} target="_blank" rel="noreferrer">GitHub</a>
<a href={portfolioIdentity.x} target="_blank" rel="noreferrer">@x6c75</a>
<a href={portfolioIdentity.orchid} target="_blank" rel="noreferrer">Orchid.ai</a>
</div>
</motion.footer>
);
Expand All @@ -88,8 +87,8 @@ function ProjectArtwork({ project }: { project: PortfolioProject }) {
alt={project.imageAlt ?? `${project.name} project artwork`}
style={{ position: "absolute", inset: 0, width: "100%", height: "100%" }}
sizes="(max-width: 820px) 92vw, 48vw"
loading={project.id === "orchid-android" ? "eager" : "lazy"}
fetchPriority={project.id === "orchid-android" ? "high" : "auto"}
loading={project.id === portfolioProjects[0]?.id ? "eager" : "lazy"}
fetchPriority={project.id === portfolioProjects[0]?.id ? "high" : "auto"}
/>
</div>
);
Expand Down Expand Up @@ -191,7 +190,7 @@ function ProjectPanel({ project, reduced }: { project: PortfolioProject; reduced
}

function ProjectExplorer({ reduced, entrance, ready }: { reduced: boolean; entrance: boolean; ready: boolean }) {
const [activeId, setActiveId] = useState(portfolioProjects[0]?.id ?? "orchid-android");
const [activeId, setActiveId] = useState<PortfolioProjectId | undefined>(portfolioProjects[0]?.id);
const activeIndex = Math.max(0, portfolioProjects.findIndex((project) => project.id === activeId));
const activeProject = portfolioProjects[activeIndex] ?? portfolioProjects[0];

Expand Down Expand Up @@ -264,7 +263,7 @@ export function SignalDesk() {
<div className={styles.heroCopy}>
<span className={styles.eyebrow}>Software engineer</span>
<h1 id="hero-title">I make stubborn software <em>behave.</em></h1>
<p>I build Orchid.ai’s native Android app, agent systems, and Linux tools that do the useful part without making a fuss.</p>
<p>I build native Android apps, agent systems, and Linux tools that do the useful part without making a fuss.</p>
<div className={styles.heroActions}>
<a href="#work">See the work <ArrowDown aria-hidden="true" /></a>
<a href={portfolioIdentity.calendar}>Start a conversation <Mail aria-hidden="true" /></a>
Expand Down
17 changes: 0 additions & 17 deletions lib/portfolio-content.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
export type PortfolioProjectId =
| "orchid-android"
| "rakazo-android"
| "linux-sonar"
| "homebot"
Expand All @@ -21,21 +20,6 @@ export type PortfolioProject = {
};

export const portfolioProjects: PortfolioProject[] = [
{
id: "orchid-android",
name: "Orchid.ai",
category: "Native Android",
eyebrow: "Current work / channel 01",
summary: "Building the native Android home for an assistant that gets things done.",
detail:
"I am building Orchid's native Android app, bringing its message-first assistant into a platform-native experience that feels at home on the device.",
href: "https://orchid.ai",
image: "/images/portfolio/orchid-desk.jpg",
imageAlt: "Orchid's public campaign artwork showing a softly lit working desk",
secondaryHref: "https://orchid.ai/blog/introducing-keiki",
secondaryLabel: "Meet Orchid",
proof: ["Native Android", "Message-first UX", "In active development"],
},
{
id: "rakazo-android",
name: "Rakazo",
Expand Down Expand Up @@ -94,5 +78,4 @@ export const portfolioIdentity = {
calendar: "https://cal.com/luinbytes",
github: "https://github.com/luinbytes",
x: "https://x.com/x6c75",
orchid: "https://orchid.ai",
} as const;
Binary file removed public/images/portfolio/orchid-desk.jpg
Binary file not shown.
8 changes: 0 additions & 8 deletions review-previews/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@ Each image shows one page area at its captured viewport. Open an image to inspec

![Home — Pip feature — Desktop · light](./homepage-desktop1440x900-light-pip-feature.jpg)

**Work - Orchid.ai**

![Home — Work - Orchid.ai — Desktop · light](./homepage-desktop1440x900-light-work-orchid-ai.jpg)

**Work - Rakazo**

![Home — Work - Rakazo — Desktop · light](./homepage-desktop1440x900-light-work-rakazo.jpg)
Expand Down Expand Up @@ -50,10 +46,6 @@ Each image shows one page area at its captured viewport. Open an image to inspec

![Home — Pip feature — Mobile · dark](./homepage-mobile390x844-dark-pip-feature.jpg)

**Work - Orchid.ai**

![Home — Work - Orchid.ai — Mobile · dark](./homepage-mobile390x844-dark-work-orchid-ai.jpg)

**Work - Rakazo**

![Home — Work - Rakazo — Mobile · dark](./homepage-mobile390x844-dark-work-rakazo.jpg)
Expand Down
Binary file not shown.
Binary file not shown.
16 changes: 0 additions & 16 deletions review-previews/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,6 @@
"colorScheme": "light",
"path": "review-previews/homepage-desktop1440x900-light-pip-feature.jpg"
},
{
"page": "homepage",
"area": "Work - Orchid.ai",
"device": "desktop1440x900-light",
"viewport": "1440x900",
"colorScheme": "light",
"path": "review-previews/homepage-desktop1440x900-light-work-orchid-ai.jpg"
},
{
"page": "homepage",
"area": "Work - Rakazo",
Expand Down Expand Up @@ -79,14 +71,6 @@
"colorScheme": "dark",
"path": "review-previews/homepage-mobile390x844-dark-pip-feature.jpg"
},
{
"page": "homepage",
"area": "Work - Orchid.ai",
"device": "mobile390x844-dark",
"viewport": "390x844",
"colorScheme": "dark",
"path": "review-previews/homepage-mobile390x844-dark-work-orchid-ai.jpg"
},
{
"page": "homepage",
"area": "Work - Rakazo",
Expand Down
8 changes: 4 additions & 4 deletions tests/browser/browser_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1144,7 +1144,7 @@ def test_homepage_is_responsive_and_routes_featured_work(self) -> None:
).is_visible()
)
expect(page.locator("#hero-title")).to_have_css("clip-path", "none")
for project in ("Orchid.ai", "Rakazo", "linux-sonar", "HomeBot", "ConnectorMap"):
for project in ("Rakazo", "linux-sonar", "HomeBot", "ConnectorMap"):
self.assertTrue(
page.get_by_role("button", name=re.compile(project, re.I)).is_visible()
)
Expand Down Expand Up @@ -1497,7 +1497,7 @@ def test_homepage_preserves_layout_and_world_state_across_viewport_matrix(self)
headingInside: heading.left >= -1 && heading.right <= width + 1 && heading.width > 120,
headerInside: header.left >= -1 && header.right <= width + 1,
pondFits: Math.abs(pond.width - width) < 1 && Math.abs(pond.height - height) < 1,
projectTargets: buttons.length === 5 && buttons.every(button => button.width >= 44 && button.height >= 44),
projectTargets: buttons.length === 4 && buttons.every(button => button.width >= 44 && button.height >= 44),
projectNamesFit: width > 430 || projectNames.every(element => {
const range = document.createRange();
range.selectNodeContents(element);
Expand Down Expand Up @@ -1654,7 +1654,7 @@ def test_navigation_and_bordered_controls_keep_their_visual_hierarchy(self) -> N
)
)
category_labels = page.locator("[aria-label='Featured projects'] button small")
self.assertEqual(category_labels.count(), 5)
self.assertEqual(category_labels.count(), 4)
self.assertTrue(
category_labels.evaluate_all(
"elements => elements.every(element => parseFloat(getComputedStyle(element).fontSize) >= 10)"
Expand Down Expand Up @@ -2267,7 +2267,7 @@ def double_tap(x, y):
impacts_before_food,
)
dropped_count = int(pond.get_attribute("data-food-dropped-count"))
project_button = page.get_by_role("button", name=re.compile("Orchid.ai", re.I))
project_button = page.get_by_role("button", name=re.compile("Rakazo", re.I))
project_button.scroll_into_view_if_needed()
box = project_button.bounding_box()
double_tap(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
Expand Down
Loading