Files
portfolio/src/data/projects.ts
T
unkn0wn 5db1b69090
Deploy Documentation / check-and-deploy (push) Successful in 13s
fix: wrong statistic
2026-06-24 20:26:25 +02:00

187 lines
9.4 KiB
TypeScript

// Projects - real content. Edit freely.
// `icon` matches a simple-icons-astro component (using PascalCase elsewhere).
export type ProjectStatus = 'live' | 'maintained' | 'archived' | 'r&d';
export interface ProjectLink {
label: string;
url: string;
icon?: string;
}
export interface Project {
slug: string;
designation: string; // catalog index, e.g. "01"
title: string;
tagline: string;
period: string;
role: string;
status: ProjectStatus;
featured: boolean;
summary: string;
context: string[];
contributions: string[];
stack: { icon: string; label: string }[];
links: ProjectLink[];
}
export const projects: Project[] = [
{
slug: 'nova-design-system',
designation: '01',
title: 'Nova Design System',
tagline: 'Astro component library - tokens, accessibility, npm distribution.',
period: '2026 - ongoing',
role: 'Author · maintainer',
status: 'maintained',
featured: true,
summary:
'A library of 29 Astro components across six families, with a complete token system (color, typography, spacing, radius) and a light/dark theme driven by CSS variables. Currently at version 1.2.1, it powers this portfolio and will be progressively adapted to my other projects, including outside the Astro ecosystem (a GPUI/Rust binding is planned for File Organizer).',
context: [
'Designed for clean, technical interfaces: mono fonts for headings, sans-serif for body text.',
'Distributed under the npm scope @unkn0wndo3s, published automatically via a CI pipeline.',
'License: free to use, resale of the design system as a standalone product is prohibited.',
'Adoption is currently internal: the download spikes seen on npm in the days after each release are mostly bot/CI traffic rather than organic external adoption so far.',
],
contributions: [
'Architecture of tokens and components (Custom Elements, typed events, slots).',
'Gitea Actions CI/CD pipeline for automated npm publishing: checkout, version check, install, publish — about 19s end to end.',
'Current documentation: component list and status at nds.louis-potevin.dev, with technical usage docs coming next.',
'6-12 month roadmap: automatic component export on every release, new components, complete documentation. Longer term (12+ months): ports to Vue.js, React, Svelte, Java, and a Rust package, with docs kept up to date for each target.',
],
stack: [
{ icon: 'astro', label: 'Astro' },
{ icon: 'typescript', label: 'TypeScript' },
{ icon: 'sass', label: 'Sass' },
{ icon: 'gitea', label: 'Gitea CI' },
],
links: [
{ label: 'Nova Design System v1.2.1', url: 'https://nds.louis-potevin.dev/', icon: 'astro' },
{ label: 'npm', url: 'https://www.npmjs.com/package/@unkn0wndo3s/nova-design-system', icon: 'npm' },
{ label: 'Sources (Gitea)', url: 'https://git.novaprojects.dev/unkn0wn/nova-design-system', icon: 'gitea' },
],
},
{
slug: 'nova-infra',
designation: '02',
title: 'Self-hosted Infrastructure & Deployment',
tagline: 'Containerized services, CI/CD, and secured ingress on a dedicated server.',
period: '2025 - ongoing',
role: 'Design & operations',
status: 'live',
featured: true,
summary:
'Self-hosted infrastructure running on a dedicated OVH server. Four application containers currently active alongside the hosted sites, with Git, secret management, and exposure through an Apache reverse proxy.',
context: [
'Containerized with Docker on a dedicated OVH server.',
'Services exposed through an Apache reverse proxy, suited to a dedicated-machine setup.',
'Two domains managed: novaprojects.dev (4+ subdomains for self-hosted services) and louis-potevin.dev (1 subdomain).',
],
contributions: [
'Setup and administration of a self-hosted Gitea instance with a Postgres backend and one Actions runner.',
'Lightweight CI/CD pipelines (build, test, publish), running in about 10-20 seconds.',
'Day-to-day operations: Docker networks, volumes, DNS, diagnostics.',
'Identified improvement areas: no monitoring or backup strategy in place yet — next iteration of the infrastructure.',
],
stack: [
{ icon: 'docker', label: 'Docker' },
{ icon: 'linux', label: 'Linux' },
{ icon: 'apache', label: 'Apache (reverse proxy)' },
{ icon: 'gitea', label: 'Gitea' },
],
links: [{ label: 'Gitea', url: 'https://git.novaprojects.dev/unkn0wn', icon: 'gitea' }],
},
{
slug: 'portfolio',
designation: '03',
title: 'louis-potevin.dev',
tagline: 'This website. Multi-page Astro app, 3D space background, 100% powered by Nova Design System.',
period: '2026',
role: 'Design & development',
status: 'live',
featured: true,
summary:
'A static multi-page portfolio (5 pages), entirely composed with Nova components, with a subtle Three.js space background. Built in one day, recently shipped.',
context: [
'Three.js background: starfield, nebula, and an ambient asteroid.',
'UI entirely composed using the in-house design system.',
'Astro with Static Site Generation (SSG), chosen for its simplicity over Svelte (already comfortable with Vue.js, and not fond of the Svelte DX).',
],
contributions: [
'Full integration of Nova tokens and components.',
'Respects prefers-reduced-motion and degrades gracefully when WebGL is unavailable.',
'Current Lighthouse scores: Accessibility 100, Best Practices 100, SEO 92, Performance 92.',
'Roadmap: multilingual version, dark/light mode toggle. No audience data yet (site just went live), no CV download for now.',
],
stack: [
{ icon: 'astro', label: 'Astro' },
{ icon: 'typescript', label: 'TypeScript' },
{ icon: 'sass', label: 'Sass' },
],
links: [{ label: 'Unkn0wn Projects', url: 'https://louis-potevin.dev/', icon: 'astro' }],
},
{
slug: 'rust-file-organizer',
designation: '04',
title: 'File Organizer - Java to Rust',
tagline: 'File sorting tool, currently being ported from Java to Rust.',
period: '2025 - ongoing',
role: 'Development',
status: 'r&d',
featured: false,
summary:
'An automatic sorting tool that moves downloaded files and folders into dedicated directories (executables, archives, etc.) at the root of the downloads folder, alongside the existing images/videos/documents directories. The Java version, functional on Windows, is being ported to Rust for Linux compatibility, cleaner code, and a simpler build.',
context: [
'Current Java version: many dependencies, slower build, loosely structured code, requires Java installed (or shipping the executable).',
'Rust version: better organized code, simpler compilation, expected scan performance on par with or better than Java.',
'GUI built with GPUI (used for the interface only), with a side console for monitoring/diagnosing errors.',
],
contributions: [
'Sorting logic: moves files/folders into type-specific directories (executables, archives, etc.), with subfolders grouped into a "folders" directory.',
'Sorting safety under review: the Java version copied then deleted the source after the copy completed (to prevent data loss); the approach will be revisited in Rust.',
'Key goal of the port: deep recursive scanning — the Java version only knows about files/folders it has moved or seen at the surface level, not nested contents.',
'Current state: UI nearly complete, sorting logic still to be rewritten; tested on small volumes so far, targeting 10k+ files at once since it runs on startup.',
'Open source on GitHub; will move to Gitea once the Rust port is finished.',
],
stack: [
{ icon: 'rust', label: 'Rust' },
{ icon: 'linux', label: 'Linux (upcoming)' },
],
links: [],
},
{
slug: 'llm-tooling',
designation: '05',
title: 'LLM Training & Inference',
tagline: 'Language models trained on a Reddit conversation dataset, aiming for a voice-capable, autonomous assistant.',
period: '2025 - ongoing',
role: 'Development',
status: 'r&d',
featured: false,
summary:
'A language model training and inference project on a dedicated machine, scaling up progressively: 100M, then 500M, 1B, and potentially 3B parameters. The end goal is a voice-capable conversational AI that learns from its conversations and gains a degree of autonomy.',
context: [
'Dedicated machine: Ryzen 9 9900X, RTX 5070 Ti, 64GB DDR5 6400MHz CL32.',
'Dataset: Reddit conversations, starting at roughly 100GB with a target of scaling up to 1-2TB.',
'Custom in-house inference script (currently being designed).',
],
contributions: [
'Assembling and structuring the Reddit conversation dataset.',
'Setting up the training pipeline, currently in the preparation phase (training has not started yet, so no quality metrics are available at this stage).',
],
stack: [
{ icon: 'python', label: 'Python' },
{ icon: 'linux', label: 'Linux' },
],
links: [],
},
];
export const featuredProjects = projects.filter((p) => p.featured);
export const statusMeta: Record<ProjectStatus, { label: string; tone: 'success' | 'primary' | 'neutral' | 'warning' }> = {
live: { label: 'Live', tone: 'success' },
maintained: { label: 'Maintained', tone: 'primary' },
'r&d': { label: 'In Progress', tone: 'warning' },
archived: { label: 'Archived', tone: 'neutral' },
};