Personal portfolio and blog for Erick Barcelos.
This repository is a single Next.js frontend application built to present professional work, independent projects, and long-form writing with a restrained editorial visual system. It is intentionally not a SaaS landing page, dashboard, CMS, backend service, or multi-package workspace.
The project is active and maintained as Erick Barcelos' public portfolio. The current implementation focuses on:
- a home page with a concise editorial introduction, professional work preview, independent project preview, and latest posts;
- a
/workpage that groups professional work and independent projects; - a local-first MDX blog under
/blogand/blog/[slug]; - a shared portfolio shell with fixed navigation, footer links, theme controls, and browser translation hardening;
- a custom visual system documented in
DESIGN.mdand implemented through CSS variables insrc/pages/globals.css.
| Area | Technology |
|---|---|
| Framework | Next.js 15 Pages Router |
| UI runtime | React 18 |
| Language | TypeScript with strict mode |
| Styling | Tailwind CSS, src/pages/globals.css, shadcn-style primitives |
| Design tokens | DESIGN.md, --portfolio-* CSS variables |
| Blog content | MDX files in content/blog/*.mdx |
| MDX pipeline | @next/mdx, gray-matter, remark-gfm, remark-math, rehype-katex |
| Theming | next-themes, light/dark class-based themes |
| Typography | Geist Pixel Square from geist/font/pixel |
| Observability | Vercel Analytics and Vercel Speed Insights |
| Package manager | pnpm is preferred because pnpm-lock.yaml is present |
- Editorial portfolio shell:
PortfolioLayoutinsrc/components/portfolio-shell.tsxowns the shared navigation, document metadata, framed page layout, animated header avatar, theme menu, and footer links. - Professional work content:
data/work/professional-work.tsstores public-safe professional work entries rendered on the home page and/work. - Independent projects:
data/projects/projects.tsstores project descriptions, stack metadata, public links, source/package links, status, and preview assets. - Local MDX blog:
content/blog/*.mdxstores posts, whilesrc/lib/blog.tsvalidates frontmatter, filters drafts, and sorts posts by date. - MDX rendering:
src/components/blog/mdx-components.tsxcustomizes prose, links, images, tables, code blocks, math output, and the optional<Figure />component. - Theme system:
next-themesis mounted insrc/pages/_app.tsx; portfolio tokens are defined insrc/pages/globals.cssand mirrored by Tailwind aliases intailwind.config.js. - Browser translation hardening:
src/pages/_document.tsxsetslang="en",translate="no", andmeta name="google" content="notranslate"to reduce DOM mutations from automatic translation tools.
portfolio/
+-- content/blog/ # Local MDX posts and the blog template
+-- data/
| +-- projects/projects.ts # Independent project entries
| +-- work/professional-work.ts # Professional work entries
| +-- techStack.ts # Shared tech-stack type values
+-- docs/
| +-- architecture.md # Technical architecture notes
| +-- blog-authoring.md # Blog writing and publishing guide
| +-- deployment.md # Deployment and production notes
+-- public/ # Images, project assets, blog assets, animation frames
+-- src/
| +-- components/ # Portfolio, blog, work, project, and UI components
| +-- hooks/ # Theme and browser interaction hooks
| +-- interface/ # TypeScript interfaces used by content data
| +-- lib/ # Blog parsing, content composition, and utilities
| +-- pages/ # Next.js Pages Router routes and global CSS
+-- DESIGN.md # Canonical visual direction
+-- AGENTS.md # Repository-specific agent and product rules
+-- next.config.mjs # Next.js, MDX, image, and bundle-analyzer config
+-- tailwind.config.js # Tailwind theme and portfolio token aliases
+-- vercel.json # Vercel project-level config
+-- package.json # Scripts and dependencies
| Route | Source | Purpose |
|---|---|---|
/ |
src/pages/index.tsx |
Home page with hero, featured professional work, featured projects, and latest posts |
/work |
src/pages/work.tsx |
Full work index for professional and independent work |
/blog |
src/pages/blog/index.tsx |
Blog index generated from published MDX posts |
/blog/[slug] |
src/pages/blog/[slug].tsx |
Static blog post page for each published MDX file |
There are no pages/api routes in the current codebase.
- Node.js
v22.2.0, as declared in.nvmrc. pnpm, because this repository includespnpm-lock.yaml.
pnpm installThe only environment variable identified in the current codebase is optional:
ANALYZE=falseIt is documented in .env.example and controls bundle analyzer activation through next.config.mjs.
No required database URL, API key, authentication secret, or storage secret was identified in the current codebase.
These scripts are defined in package.json.
| Script | Command | Notes |
|---|---|---|
dev |
pnpm dev |
Starts the Next.js development server after removing ./.next. |
build |
pnpm build |
Runs the production Next.js build. |
build:analyze |
pnpm build:analyze |
Runs the configured bundle-analysis build path when ANALYZE=true. The script currently delegates to npm run build internally. |
start |
pnpm start |
Starts the production Next.js server after a successful build. |
lint |
pnpm lint |
Runs the lint command currently defined as next lint. |
Agent note: repository instructions currently forbid running dev, start, or build commands in this environment. The commands are documented here because they are part of the project workflow.
Edit data/work/professional-work.ts.
Each entry follows IProfessionalWorkItem from src/interface/IProfessionalWorkItem.ts and is rendered through src/components/professional-work-card.tsx.
Use this dataset for work that can be publicly described without exposing confidential implementation details. Keep descriptions concrete, short, and safe.
Edit data/projects/projects.ts.
Each project follows IProject from src/interface/IProject.ts and can include:
slug,name,description, andstatus;techStackvalues fromdata/techStack.ts;- a public
link,gitLink, ornpmUrl; coverImageunderpublic/images/projects/...;previewModeset toimageoriframe.
Featured project order is controlled by featuredProjectSlugs in src/lib/portfolio-content.ts.
Create or edit .mdx files in content/blog/.
Use content/blog/_template.mdx as the starting point. Files beginning with _ are intentionally ignored by the blog loader.
Required frontmatter:
title: "Post title"
summary: "One clear sentence explaining the post."
publishedAt: "2026-04-22"
tags:
- Engineering
draft: falseOptional frontmatter:
coverImage: "/images/blog/my-post/cover.svg"See docs/blog-authoring.md for the full writing guide.
The application uses static generation for public content pages:
src/pages/index.tsxreads the latest blog posts withgetLatestBlogPosts.src/pages/blog/index.tsxreads all published blog posts withgetAllBlogPosts.src/pages/blog/[slug].tsxusesgetStaticPathsandgetStaticPropsto render one route per published MDX post.
The blog metadata parser lives in src/lib/blog.ts. The MDX component modules are resolved in src/lib/blog-content.ts with require.context.
For more detail, see docs/architecture.md.
The repository is Vercel-oriented:
@vercel/analyticsand@vercel/speed-insightsare mounted insrc/pages/_app.tsx.vercel.jsonis present and currently setsgit.deploymentEnabledtofalse.- No required production secrets were identified.
See docs/deployment.md for deployment notes and current limitations.
No test runner, test files, or dedicated testing configuration were identified in the current codebase.
Useful static checks for documentation and small code changes:
git diff --check
rg "some text to verify"The repository defines pnpm lint, but no dedicated test script is currently present.
DESIGN.md is the canonical visual reference. New UI work should follow its current "Quiet Techno Swiss" direction:
- neutral white/light-gray and black/charcoal bases;
- restrained accent usage;
- editorial structure over dashboard density;
- opaque surfaces by default;
- strong typography, disciplined spacing, and limited decorative effects.
The implementation surface for that system is primarily src/pages/globals.css, tailwind.config.js, components.json, and the shared shell/components under src/components/.
- No API routes are currently implemented.
- No database, ORM, migrations, or persistent backend storage are currently present.
- No authentication or authorization system is currently present.
- No test suite is currently configured.
- Deployment is Vercel-oriented, but the exact production release process is not fully documented in the codebase.
vercel.jsoncurrently disables Git deployments.
No license file is currently present.