# developer-portfolio: version 0.1.0 in the manifest, v2.1 in the tag list, and no LICENSE file

> A Next.js 16 and Tailwind CSS 4 portfolio template with two Dockerfiles, a two service compose file and six environment variables. The copy in package.json still describes one person's site, the dependency list carries two competing email paths, and the version in the manifest never moved.

**said7388/developer-portfolio** — Software Developer Portfolio Website built with next.js and tailwind CSS that helps you showcase your work and skills as a software developer.

- Repository: https://github.com/said7388/developer-portfolio
- Website: https://abusaid.netlify.app
- Stars: 2,409 · Forks: 1,145
- Language: JavaScript
- License: not declared
- Published: 2026-09-28 · Updated: 2026-09-28 · Language: en
- Canonical page: https://hysenlabs.com/projects/said7388-developer-portfolio

## The manifest describes one person's site, not the template

Two fields in package.json read as leftovers from the author's own deployment. The description is Portfolio of Abu Said, which is a person rather than a template, and the version is 0.1.0. Meanwhile the tag list holds v2.0 from 2024-03-08, titled as a new design with NextJS and Tailwind CSS, and v2.1 from 2024-04-25, titled as adding Google Analytics and a captcha. So the released versions are 2.x and the manifest says 0.1.0, which means the version field was never bumped to match the tags and cannot be used to tell two checkouts apart. The last recorded push is dated 2026-06-05, more than two years after the newest tag, so what is on the branch is well past anything the release list describes. The package is also marked private, so nothing is published to a registry under this name.

## Three lockfiles for one package manager recommendation

The installation instructions recommend pnpm, and then offer npm and yarn as alternatives in the same block, with pnpm install, npm install and yarn install each given as a one liner. The tree does not pick one. There is a package-lock.json, a pnpm-lock.yaml and a pnpm-workspace.yaml. A pnpm workspace file alongside a Next.js application is also worth a second look, since the repository is a single app directory with no other packages, so the workspace file is not obviously doing anything. The practical consequence is that whichever manager you use, one of the three lockfiles is going to be ignored and another will be regenerated on your first install, and whichever you choose determines the resolution your teammates get.

## Two email paths in one dependency list

The contact form has more than one implementation available. nodemailer is in the dependency list for server side sending, and @emailjs/browser is also there for sending from the browser. The tech stack table names only Nodemailer under email sending, and the feature list says the contact form has email and Telegram notifications, so the Telegram path is the second channel rather than EmailJS. Two other dependencies map to the newest release note: react-google-recaptcha for the captcha and @next/third-parties for Google Analytics. sharp is in the list as well, which matters for Docker builds because it is a native binary rather than pure JavaScript. On the styling side there are both a tailwind.config.js and a postcss.config.js, while the dev dependencies carry @tailwindcss/postcss alongside autoprefixer.

## Six environment variables, two of them shipped to the browser

The example environment file is six lines:

```bash
NEXT_PUBLIC_GTM =
NEXT_PUBLIC_APP_URL = 
TELEGRAM_BOT_TOKEN = 
TELEGRAM_CHAT_ID = 
GMAIL_PASSKEY = 
EMAIL_ADDRESS =
```

The NEXT_PUBLIC prefix is the important detail. Two of the six are exposed to the browser by Next.js, which is appropriate for a container id and a site URL and wrong for anything secret. The other four are server side: the Telegram bot token and chat id, the Gmail app password, and the address to send from. The Gmail passkey is the app password from the tutorial section in the table of contents. One gap: the blog section is described as fetching posts from dev.to automatically, and no variable here identifies the dev.to account, so that handle is configured somewhere in the source rather than in the environment.

## Two compose services, demo names, and 3005 for production

The compose file defines two services from the same context. The dev service builds from Dockerfile.dev, sets WATCHPACK_POLLING, mounts the working tree into the container and then masks node_modules and .next with anonymous volumes, which is the standard way to keep container dependencies out of the host tree, and publishes port 3000. The prod service builds from Dockerfile.prod and publishes 3005 to 3000, so the production container is not reachable on the same port as development. Both read the same .env file, and both containers are named after the demo, demo-nextjs and demo-nextjs-dev, which is a naming choice that survives from when this compose file belonged to the author's own demo. WATCHPACK_POLLING is also a leftover of the webpack era of file watching, while the dev script is next dev.

## The table of contents promises a licence the tree does not have

The table of contents at the top of the README includes a License entry, alongside Contributing and Support. There is no LICENSE file among the top level entries of the repository, which hold the two Dockerfiles, the compose file, the lockfiles, app/, public/, utils/, the build and lint configuration files and the README itself. The project metadata records no licence either. So the two places that would normally settle the question are both empty, while the document promises a section that would answer it. Anyone copying this template into a project they intend to publish should raise that question with the author before shipping, since a fork inherits nothing from a template with no stated terms.

## Four scripts and no way to run a test

The manifest defines four scripts: dev, build, start and lint, where dev is next dev, build is next build, start is next start and lint is eslint. There is no test script and no test runner in the dependency list, so the template ships no way to check a change other than loading the page. That is a reasonable position for a presentation site and a poor one for anything you extend, since a contact form with server actions and a Telegram integration is exactly the kind of code that wants a test. The lint configuration is a flat config file, eslint.config.mjs, which matches the eslint 9 entry in dev dependencies, and the project uses jsconfig.json rather than tsconfig.json, consistent with its JavaScript primary language.

## Docker is documented three ways and one command stops mid-line

Deployment is offered as compose first, marked recommended, with three commands: docker-compose up --build, the detached variant docker-compose up -d --build, and docker-compose down to stop. The second option builds the development image directly with a tag and a Dockerfile.dev, then runs it with a published port and a container name. The command for that run is written as a single line ending in developer-portfolio:, with the image tag after the colon and nothing following it, so the example as printed cannot be copied without completing the tag yourself. That is the last visible line of the deployment walkthrough, and the tutorials it points to, for the Gmail app password, the Telegram bot and the dev.to fetch, come after it.

## Conclusion

Use developer-portfolio as a starting point if you want an App Router site with a contact form, a blog feed and a container setup already wired, and if you are comfortable replacing every piece of personal content rather than filling it in. Four things to check first. The template ships no licence file and records no licence, so treat the code as unlicensed until the author states otherwise, particularly before you publish a fork. The manifest description and version belong to the author's own deployment rather than to the template. There are three lockfiles in the tree, so pick one package manager before your first install. And there is no test script at all, so any change you make is verified by loading the page.

## FAQ

### How do I start the developer-portfolio template?

Fork and clone the repository, run pnpm install, copy .env.example to .env with cp .env.example .env, then run pnpm dev and open http://localhost:3000.

### Which Node.js version does developer-portfolio need?

Node.js 18.17.0 or later, with Node 20 and above recommended. The README notes that Next.js 16 requires 18.17 or later, and the tech stack table pins Next.js 16.0.1 and React 19.2.0.

### What environment variables does developer-portfolio need?

Six: NEXT_PUBLIC_GTM, NEXT_PUBLIC_APP_URL, TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, GMAIL_PASSKEY and EMAIL_ADDRESS. The two NEXT_PUBLIC ones are exposed to the browser by Next.js.

### Does developer-portfolio have automated tests?

No test script is defined in the manifest and no test runner is in the dependency list. The only scripts are dev, build, start and lint, where lint runs eslint.

### What licence is developer-portfolio under?

Nothing in the repository states one. There is no LICENSE file among the top level entries and no licence is recorded in the project metadata, although the README table of contents includes a License section.

### How do I run developer-portfolio with Docker?

With Docker Compose: docker-compose up --build, optionally detached with docker-compose up -d --build, and stopped with docker-compose down. The compose file defines a dev service built from Dockerfile.dev on port 3000 and a prod service built from Dockerfile.prod published on 3005.

## Sources

- [Issues](https://github.com/said7388/developer-portfolio/issues)
- [Project website](https://abusaid.netlify.app)
- [README](https://github.com/said7388/developer-portfolio/blob/main/README.md)
- [Releases](https://github.com/said7388/developer-portfolio/releases)
- [said7388/developer-portfolio on GitHub](https://github.com/said7388/developer-portfolio)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/said7388-developer-portfolio
