This is a Next.js-based interactive portfolio designed to look and feel like a retro desktop operating system.
- Interactive Desktop UI: Draggable icons and resizable, draggable windows.
- Retro Theme: Styled with Tailwind CSS and CSS variables for easy theming.
- Component-Based: Built with React and Next.js App Router.
- Fully Dynamic Content: Easily manage all portfolio items, articles, and terminal commands by editing simple JSON and Markdown files.
- Static Site Generation: Optimized for performance and easy hosting.
- Responsive Design: Adapts for a seamless experience on mobile devices.
To run the portfolio locally, follow these steps:
-
Install dependencies:
npm install
-
Run the development server:
npm run dev
-
Open http://localhost:3000 in your browser to see the result.
This portfolio is designed to be highly customizable. All content is managed through JSON configuration files in src/data/ and Markdown content files in public/content/.
You can change the color scheme of the entire UI by editing the CSS variables in src/app/globals.css. The colors are defined using HSL values.
@layer base {
:root {
--background: 240 100% 6%; /* Hue, Saturation, Lightness */
--foreground: 81 91% 53%;
--primary: 81 91% 53%;
/* ... and so on */
}
}To add, remove, or modify the desktop icons and the windows they open, you only need to edit two places:
-
Edit the Data File: Open
src/data/portfolio-data.json. Each object in theitemsarray represents a desktop icon.{ "items": [ { "id": "about", "title": "About Me", "icon": "User", "defaultSize": { "width": 500, "height": 350 }, "filePath": "content/portfolio-items/about.md" } ] }id: A unique identifier.title: The name displayed under the icon and in the window title bar.icon: The name of any icon from the Lucide icon library. For example,Rocket,Briefcase,Mail.defaultSize: The initial width and height of the window when it opens.filePath: The path to the Markdown file that contains the content for this window, relative to thepublicdirectory.
-
Create the Content File: Create a new Markdown (
.md) file inside thepublic/content/portfolio-items/directory. The name should match thefilePathyou defined in the JSON file.
That's it! The app will dynamically load the new item.
The "Articles" application works similarly.
-
Edit the Data File: Open
src/data/articles-data.json. You can add new topics or add new articles to existing topics.{ "topics": [ { "id": "tech-guides", "title": "Tech Guides", "articles": [ { "id": "my-first-article", "title": "My First Article", "summary": "An introduction to dynamic content.", "filePath": "content/articles/my-first-article.md" } ] } ] }filePath: The path to the article's Markdown file, relative to thepublicdirectory.
-
Create the Content File: Create the corresponding
.mdfile inside thepublic/content/articles/directory.
You can add or modify terminal commands by editing src/data/commands.json.
{
"commands": [
{
"command": "about",
"description": "Display information about me.",
"type": "component",
"content": "about"
},
{
"command": "help",
"description": "Show this help message.",
"type": "special",
"content": "help"
}
]
}command: The command string the user types.description: The text shown in thehelpcommand output.type:component: Renders the content of a portfolio item directly in the terminal. Thecontentfield must match theidof an item inportfolio-data.json.text: Prints thecontentstring directly to the terminal.special: For built-in commands likehelp,date, orclear.
content: The value associated with the command'stype.