function Experience() {
const [entries, setEntries] = React.useState(null);
const [error, setError] = React.useState(null);
React.useEffect(() => {
fetch("experience.json", { cache: "no-cache" })
.then((r) => {
if (!r.ok) throw new Error(`HTTP ${r.status}`);
return r.json();
})
.then((data) => setEntries(Array.isArray(data) ? data : [data]))
.catch((e) => {
console.error("Failed to load experience.json", e);
setError(e.message);
setEntries([]);
});
}, []);
return (
03 · Experience
A timeline of building.
{entries === null && (
Loading experience…
)}
{error && (
Failed to load experience.json
)}
{entries &&
entries.map((entry, idx) => (
))}
);
}
function ExperienceCard({ entry }) {
const {
role,
company,
period,
tags = [],
summary,
highlights = [],
} = entry;
return (
{role} {company && @ {company}}
{period &&
{period}}
{tags.length > 0 && (
{tags.join(" · ")}
)}
{summary && {summary}
}
{highlights.length > 0 && (
{highlights.map((h, i) => (
{String(i + 1).padStart(2, "0")}
{h}
))}
)}
);
}
function TechStack() {
const [data, setData] = React.useState(null);
const [tab, setTab] = React.useState(null);
const [error, setError] = React.useState(null);
React.useEffect(() => {
fetch("stack.json", { cache: "no-cache" })
.then((r) => {
if (!r.ok) throw new Error(`HTTP ${r.status}`);
return r.json();
})
.then((d) => {
setData(d);
if (d.categories && d.categories.length > 0) setTab(d.categories[0].id);
})
.catch((e) => {
console.error("Failed to load stack.json", e);
setError(e.message);
});
}, []);
const categories = (data && data.categories) || [];
const active = categories.find((c) => c.id === tab);
return (
04 · Stack
Tools, opinionated.
A working stack assembled around clarity, scale, and operational sanity
— not novelty.
{error && (
Failed to load stack.json
)}
{!error && data === null && (
Loading stack…
)}
{categories.length > 0 && (
{categories.map((c) => (
))}
)}
{active && (
{active.items.map((it) => (
{it.glyph}
{it.name}
{it.desc}
))}
)}
);
}
function Projects() {
const [items, setItems] = React.useState(null);
const [error, setError] = React.useState(null);
React.useEffect(() => {
fetch("projects.json", { cache: "no-cache" })
.then((r) => {
if (!r.ok) throw new Error(`HTTP ${r.status}`);
return r.json();
})
.then((d) => setItems(Array.isArray(d) ? d : []))
.catch((e) => {
console.error("Failed to load projects.json", e);
setError(e.message);
setItems([]);
});
}, []);
return (
05 · Projects
Selected work.
Systems shipped, AI experiments productionized, and platforms built
for teams who actually use them.
{error && (
Failed to load projects.json
)}
{items === null && !error && (
Loading projects…
)}
{items && items.length > 0 && (
{items.map((p, i) => (
{p.label}
{p.status && {p.status}}
{p.code &&
{p.code}}
{p.title}
{p.description &&
{p.description}
}
{p.tech && p.tech.length > 0 && (
{p.tech.map((t) => (
{t}
))}
)}
))}
)}
);
}
Object.assign(window, { Experience, TechStack, Projects });