diff --git a/app/blogs/page.tsx b/app/blogs/page.tsx index 4d99853..e651f80 100644 --- a/app/blogs/page.tsx +++ b/app/blogs/page.tsx @@ -14,7 +14,6 @@ const BlogsPage = async () => { patterns, and lessons I pick up along the way. Each piece is a snapshot of how I was thinking about the problem at the time. -
{blogs.map((blog) => ( ( + (groups, project) => { + const group = project.src ? groups.apps : groups.tools; + group.push(project); + return groups; + }, + { tools: [], apps: [] }, + ); + + const TOOLS_TITLE = "Tools, libraries, and experiments"; + const APPS_TITLE = "Applications and websites"; + + return ( + <> + + + I enjoy building things and bringing ideas to life through software. + Here you'll find a collection of projects I've worked on, + technologies I've explored, and lessons I've picked up along + the way. This page groups projects into two sections:{" "} + + {TOOLS_TITLE} + {" "} + and{" "} + + {APPS_TITLE} + + . + + + + + + ); +} + +const ProjectSection = ({ + id, + title, + description, + projects, +}: { + id: string; + title: string; + description: string; + projects: ProjectProps[]; +}) => { + return ( +
+
+

+ {title} +

+

{description}

+
+
    + {projects.map((props: ProjectProps) => { + return ( + + ); + })} +
+
+ ); +}; + const Project = ({ src, - site, repo, title, description, @@ -42,18 +129,6 @@ const Project = ({ hover="hover:stroke-secondary" /> - {site && ( - - - - )}
    @@ -77,35 +152,3 @@ const Project = ({ ); }; - -export default function ProjectPage() { - return ( - <> - - - I enjoy building things and bringing ideas to life through software. - Here you'll find a collection of projects I've worked on, - technologies I've explored, and lessons I've picked up along - the way. - -
    -
      - {projects.map((props: ProjectProps) => { - return ( - - ); - })} -
    - - - ); -} diff --git a/components/ui/Icon.tsx b/components/ui/Icon.tsx index fc40a8e..6684053 100644 --- a/components/ui/Icon.tsx +++ b/components/ui/Icon.tsx @@ -2,9 +2,9 @@ import { cn } from "@/lib/utils"; import { type Technologies } from "@/lib/projects"; import React from "@/icons/react.svg"; import JavaScript from "@/icons/javascript.svg"; -import CSS from "@/icons/css.svg"; +import Go from "@/icons/go.svg"; +import Rust from "@/icons/rust.svg"; import Cloudinary from "@/icons/cloudinary.svg"; -import EJS from "@/icons/ejs.svg"; import Node from "@/icons/node.svg"; import Express from "@/icons/express.svg"; import MongoDB from "@/icons/mongodb.svg"; @@ -19,6 +19,9 @@ import Vercel from "@/icons/vercel.svg"; import Railway from "@/icons/railway.svg"; import Astro from "@/icons/astro.svg"; import Preact from "@/icons/preact.svg"; +import PostgreSQL from "@/icons/postgresql.svg"; +import Prisma from "@/icons/prisma.svg"; +import JWT from "@/icons/jwt.svg"; import Github from "@/icons/github.svg"; import ExternalLink from "@/icons/external-link.svg"; import UpArrow from "@/icons/uparrow.svg"; @@ -67,6 +70,18 @@ export const icons: Record< {...props} /> ), + go: (props) => ( + + ), + rust: (props) => ( + + ), cloudinary: (props) => ( ), - css: (props) => ( - - ), - ejs: (props) => ( - - ), tailwind: (props) => ( ), @@ -163,6 +166,24 @@ export const icons: Record< {...props} /> ), + postgresql: (props) => ( + + ), + prisma: (props) => ( + + ), + jwt: (props) => ( + + ), github: (props) => ( <>, blogs: (props) => <>, projects: (props) => <>, - go: (props) => <>, - rust: (props) => <>, cli: (props) => <>, + clap: (props) => <>, package: (props) => <>, library: (props) => <>, + utility: (props) => <>, + productivity: (props) => <>, + notes: (props) => <>, + collections: (props) => <>, + "language-design": (props) => <>, + parsing: (props) => <>, + "code-gen": (props) => <>, interpreter: (props) => <>, - jwt: (props) => <>, - postgresql: (props) => <>, - prisma: (props) => <>, }; export default Icon; diff --git a/icons/css.svg b/icons/css.svg deleted file mode 100644 index 5b0c330..0000000 --- a/icons/css.svg +++ /dev/null @@ -1,4 +0,0 @@ - -css3 - - \ No newline at end of file diff --git a/icons/ejs.svg b/icons/ejs.svg deleted file mode 100644 index 20db012..0000000 --- a/icons/ejs.svg +++ /dev/null @@ -1 +0,0 @@ -file_type_ejs \ No newline at end of file diff --git a/icons/go.svg b/icons/go.svg new file mode 100644 index 0000000..1004791 --- /dev/null +++ b/icons/go.svg @@ -0,0 +1 @@ +Go diff --git a/icons/jwt.svg b/icons/jwt.svg new file mode 100644 index 0000000..2862a4b --- /dev/null +++ b/icons/jwt.svg @@ -0,0 +1 @@ +JSON Web Tokens diff --git a/icons/postgresql.svg b/icons/postgresql.svg new file mode 100644 index 0000000..fa8193e --- /dev/null +++ b/icons/postgresql.svg @@ -0,0 +1 @@ +PostgreSQL diff --git a/icons/prisma.svg b/icons/prisma.svg new file mode 100644 index 0000000..6f8701c --- /dev/null +++ b/icons/prisma.svg @@ -0,0 +1 @@ +Prisma diff --git a/icons/rust.svg b/icons/rust.svg new file mode 100644 index 0000000..92357b7 --- /dev/null +++ b/icons/rust.svg @@ -0,0 +1 @@ +Rust diff --git a/lib/projects.ts b/lib/projects.ts index 53c8587..60b65b7 100644 --- a/lib/projects.ts +++ b/lib/projects.ts @@ -4,11 +4,18 @@ export type Technologies = | "go" | "rust" | "cli" + | "clap" | "package" | "library" + | "utility" + | "productivity" + | "notes" + | "collections" + | "language-design" + | "parsing" + | "code-gen" | "interpreter" | "cloudinary" - | "css" | "node" | "express" | "mongodb" @@ -17,7 +24,6 @@ export type Technologies = | "vercel" | "tailwind" | "mdx" - | "ejs" | "railway" | "typescript" | "nextjs" @@ -30,7 +36,6 @@ export type Technologies = export type ProjectProps = { src?: `${string}.jpg`; - site?: string; repo: `https://github.com/${string}`; title: string; description: string; @@ -43,7 +48,7 @@ const unsortedProjects: ProjectProps[] = [ { repo: "https://github.com/schneedotdev/deal", title: "deal", - technologies: ["rust", "library"], + technologies: ["rust", "library", "utility"], description: "A lightweight Rust library for managing decks of cards. Deal provides reusable primitives for creating, shuffling, and dealing cards in card-based applications and games.", createdAt: "2025-02-07T23:11:21Z", @@ -52,7 +57,7 @@ const unsortedProjects: ProjectProps[] = [ { repo: "https://github.com/schneedotdev/til", title: "til", - technologies: ["rust", "cli"], + technologies: ["rust", "cli", "clap", "productivity", "notes"], description: "A command-line tool for capturing and revisiting short technical notes. TIL keeps useful discoveries organized and accessible directly from the terminal.", createdAt: "2024-08-09T23:40:26Z", @@ -61,7 +66,7 @@ const unsortedProjects: ProjectProps[] = [ { repo: "https://github.com/schneedotdev/pizza", title: "pizza", - technologies: ["go", "package"], + technologies: ["go", "package", "collections", "utility"], description: "A Go package that provides chainable helper methods for working with slices. Pizza explores a more composable API for common collection transformations.", createdAt: "2024-07-18T00:25:45Z", @@ -70,7 +75,7 @@ const unsortedProjects: ProjectProps[] = [ { repo: "https://github.com/schneedotdev/rust-driven-interpreter", title: "rust driven interpreter", - technologies: ["rust", "interpreter"], + technologies: ["rust", "interpreter", "language-design", "parsing"], description: "A programming language interpreter implemented in Rust. The project explores parsing, evaluation, environments, and the core mechanics behind executing source code.", createdAt: "2024-03-02T02:32:19Z", @@ -79,7 +84,7 @@ const unsortedProjects: ProjectProps[] = [ { repo: "https://github.com/schneedotdev/compose", title: "compose", - technologies: ["rust", "cli"], + technologies: ["rust", "cli", "clap", "code-gen"], description: "A Rust command-line tool for generating Rust code from a simpler input format. Compose focuses on reducing repetitive implementation work through code generation.", createdAt: "2023-08-30T03:50:29Z", @@ -87,7 +92,6 @@ const unsortedProjects: ProjectProps[] = [ }, { src: "schneedotdev.jpg", - site: "https://schnee.dev/", title: "schnee.dev", repo: "https://github.com/schneedotdev/schnee.dev", technologies: ["nextjs", "typescript", "react", "mdx", "tailwind"], @@ -96,12 +100,27 @@ const unsortedProjects: ProjectProps[] = [ createdAt: "2023-06-27T23:07:02Z", year: "'23", }, + { + repo: "https://github.com/schneedotdev/changelog", + title: "changelog", + technologies: [ + "typescript", + "node", + "express", + "postgresql", + "prisma", + "jwt", + ], + description: + "A backend API for managing changelog entries and release notes. The project focuses on API design, authentication, relational data modeling, and structured persistence with PostgreSQL and Prisma.", + createdAt: "2022-12-30T04:14:37Z", + year: "'22", + }, { src: "attri.jpg", - site: "https://attrienterprises.vercel.app/", repo: "https://github.com/schneedotdev/attrienterprises-optimized", title: "attri enterprises", - technologies: ["astro", "typescript", "preact", "css", "vercel"], + technologies: ["astro", "typescript", "preact", "vercel"], description: "A performance-focused marketing site for a Brooklyn-based business. Static generation, image optimization, reduced bundle sizes, and lazy hydration improved mobile load times by 60% and desktop load times by 71%.", createdAt: "2023-03-10T22:59:15Z", @@ -109,14 +128,11 @@ const unsortedProjects: ProjectProps[] = [ }, { src: "climbers.jpg", - site: "https://climbersconnect.up.railway.app/", repo: "https://github.com/schneedotdev/climbers-connect", title: "climbers connect", technologies: [ "typescript", "node", - "ejs", - "css", "mongodb", "mongoose", "cloudinary", @@ -130,54 +146,14 @@ const unsortedProjects: ProjectProps[] = [ }, { src: "brianschnee.jpg", - site: "https://brianschnee.com/", repo: "https://github.com/schneedotdev/portfolio-optimized", title: "brianschnee.com", - technologies: ["astro", "typescript", "preact", "css", "netlify"], + technologies: ["astro", "typescript", "preact", "netlify"], description: "An earlier version of my personal portfolio focused on freelance development work. The site was built as a fast, static experience with an emphasis on presentation and performance.", createdAt: "2023-03-31T06:34:30Z", year: "'23", }, - { - src: "timeato.jpg", - site: "https://timeato.up.railway.app/", - repo: "https://github.com/devv-work/timeato", - title: "timeato", - technologies: [ - "javascript", - "node", - "express", - "mongodb", - "mongoose", - "passport", - "ejs", - "railway", - ], - description: - "A Pomodoro-style productivity application for organizing work into focused sessions and scheduled breaks. Timeato helps users structure study or work sessions around consistent time blocks.", - createdAt: "2022-08-31T22:31:39Z", - year: "'22", - }, - { - src: "findadev.jpg", - site: "https://find-a-dev.up.railway.app/", - repo: "https://github.com/schneedotdev/find-a-dev", - title: "find a dev", - technologies: [ - "javascript", - "node", - "express", - "mongodb", - "ejs", - "css", - "railway", - ], - description: - "A mentorship platform for aspiring developers to find tutors by technology and area of expertise. Find a dev focuses on connecting learners with experienced developers who can provide targeted guidance.", - createdAt: "2022-08-04T01:13:25Z", - year: "'22", - }, ]; export const projects = [...unsortedProjects].sort((a, b) => diff --git a/public/assets/findadev.jpg b/public/assets/findadev.jpg deleted file mode 100644 index 941ec1c..0000000 Binary files a/public/assets/findadev.jpg and /dev/null differ diff --git a/public/assets/timeato.jpg b/public/assets/timeato.jpg deleted file mode 100644 index 5ad995d..0000000 Binary files a/public/assets/timeato.jpg and /dev/null differ