A web application for creating, organizing, and searching notes. This repository combines NoteKeeperFront and NoteKeeperBack while preserving the Git history of both projects.
- Registration and sign-in with JWT and standard ASP.NET Core password hashing
- Categories and notes with search, pagination, and file attachments
- Complete access isolation so users can only view their own notes and files
- Angular 22 and ASP.NET Core on .NET 10 in a single web service
- PostgreSQL with automatic EF Core migrations
- Docker, Docker Compose, Render Blueprint, and GitHub Actions
Prerequisite: Docker Desktop
docker compose up --buildThen open http://localhost:8080. To stop the application:
docker compose downData persists in the local notekeeper-data volume. To intentionally remove the local data, run docker compose down -v.
Start PostgreSQL first:
docker compose up database -d
dotnet run --project NoteBookKeeper.ApiIn a second terminal:
cd ClientApp
npm ci
npm startAngular runs at http://localhost:4200 and proxies /api requests to ASP.NET Core.
dotnet build NoteBookKeeper.sln -c Release
cd ClientApp
npm ci
npm run build
npm test -- --browsers=ChromeHeadless
cd ..
./scripts/e2e.ps1
docker build -t notekeeper:local .After starting the application, /api/health should return Healthy. Create a test account, sign in, create a category and a note with an image, and verify in another browser that the file cannot be downloaded without a token.
The render.yaml file provisions a web service and PostgreSQL database. Select Deploy to Render, sign in to Render, and confirm the Blueprint. A secure JWT key is generated automatically.
Render's free plan is suitable for demos, but its free database is not permanent. For a long-lived portfolio project, upgrade the database or connect
DATABASE_URLto a persistent PostgreSQL instance.
ClientApp/ Angular frontend
NoteBookKeeper.Api/ ASP.NET Core API and EF Core
Dockerfile Production image for both apps
docker-compose.yml Local web app + PostgreSQL
render.yaml One-click cloud blueprint
The original repositories contained sample configuration values in their history. The current version does not commit real secrets. If any historical value was used in a real environment, rotate it because removing it from the current files does not remove it from Git history.