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