Personal portfolio site focused on front-end: an IDE-like experience, themes, internationalization, and projects pulled from GitHub.
- IDE-inspired interface
- Light and dark theme (persisted in the browser)
- Content in Portuguese and English
- Repository list via the public GitHub API (user
EDusik; no token required) - Local project fallback if the API fails or returns empty
- 3D scene with Three.js (React Three Fiber + Drei)
- Sass styling and design tokens under
src/styles/
| Layer | Choice |
|---|---|
| Framework | Next.js 15 (App Router, RSC where applicable) |
| Language | TypeScript 5 |
| UI | React 19 |
| Styling | Sass (SCSS), variables in src/styles/tokens/ |
| 3D / WebGL | Three.js, React Three Fiber, Drei |
| Typography | next/font (Inter, JetBrains Mono) |
| Tooling | ESLint 9, Stylelint 17, Prettier 3; Husky + lint-staged + Commitlint in the local workflow |
| Package | Role |
|---|---|
next |
Routing, build, SSR/RSC, metadata |
react / react-dom |
UI and hydration |
three |
Scene and WebGL rendering |
@react-three/fiber |
React render tree over Three.js |
@react-three/drei |
3D helpers (pmndrs community utilities) |
clsx |
Conditional CSS classes (used with cn() in @/lib/utils) |
node-emoji |
:shortcode: expansion for descriptions from GitHub |
| Package | Role |
|---|---|
typescript |
Static typing |
sass |
SCSS compilation |
eslint, eslint-config-next, eslint-config-prettier |
JS/TS linting aligned with Next |
@eslint/eslintrc |
Flat ESLint config |
stylelint, stylelint-config-prettier-scss, stylelint-config-recommended-scss |
CSS/SCSS linting |
prettier |
Formatting |
postcss |
CSS pipeline (used by Next) |
@types/node, @types/react, @types/react-dom, @types/three |
TypeScript types |
husky |
Git hooks |
lint-staged |
Lint staged files |
@commitlint/cli, @commitlint/config-conventional |
Conventional commit messages |
Pinned versions: see package.json and yarn.lock.
- Node.js 20+ (matches the project toolchain)
yarn install
yarn devOpen http://localhost:3000.
Production build and local server:
yarn build
yarn start| Script | Description |
|---|---|
yarn dev |
Development server |
yarn build |
Production build |
yarn start |
Serve the production build |
yarn lint |
ESLint + Stylelint |
yarn lint:fix |
Auto-fix what the tools can |
yarn format |
Prettier (write) |
yarn format:check |
Prettier (check) |
yarn type-check |
tsc --noEmit |
The npm/yarn prepare script installs Husky hooks when a .git directory exists.
| Variable | Required | Description |
|---|---|---|
NEXT_PUBLIC_SITE_URL |
No | Canonical site URL (Open Graph / metadataBase). Example: https://your-domain.com. If missing or invalid, the code falls back to http://localhost:3000 β set your public URL in production. |
The home page (src/app/page.tsx) calls fetchRepos() in src/lib/github.ts, which uses the public API; on failure it uses the fallback list defined in the same file.
Root overview (excluding node_modules / .next):
.
βββ .husky/ # Git hooks (e.g. pre-commit, commit-msg)
βββ public/
β βββ static/ # favicon, PWA manifest, icons
βββ src/
β βββ app/ # App Router: layout, home page, icon.svg
β βββ components/
β β βββ AppProviders/ # Provider composition
β β βββ ContactPage/ # βContactβ panel + terminal
β β βββ Editor/ # Main editor-like area
β β βββ Hero/ # Hero block + 3D scene (HeroScene)
β β βββ HomePage/
β β βββ Ide/ # IDE shell (home composition)
β β βββ ProjectsPage/
β β βββ Sidebar/
β β βββ SiteHead/ # Metadata (metadata/)
β β βββ Statusbar/
β β βββ Topbar/
β β βββ shared/ # Reusable UI (Tabs, ProjectCard, SvgIcons, β¦)
β βββ contexts/ # I18nContext, TabsContext, ThemeContext
β βββ hooks/ # useMediaQuery, useScrollSpy, β¦
β βββ lib/
β β βββ constants/ # Sections, virtual files, language colors, β¦
β β βββ i18n/ # Dictionaries and types
β β βββ github.ts # Repository fetch
β β βββ utils.ts # cn(), helpers
β βββ styles/ # SCSS entry (index), globals, tokens, partials, mixins
βββ CLAUDE.md
βββ eslint.config.mjs
βββ next.config.mjs
βββ package.json
βββ stylelint.config.mjs
βββ tsconfig.json
βββ yarn.lock
Code conventions, imports, and SCSS: CLAUDE.md (mirrored in .cursor/rules/claude-conventions.mdc).
Works on Vercel or any environment that runs Node for Next.js apps. In production, set NEXT_PUBLIC_SITE_URL to your public URL for correct metadata and social sharing.
