Education Plan Tracker
Overview
Backend service powering an apprenticeship‑tracking application used to record, evaluate, and visualise Handlungskompetenzen (practical competencies) over time. Built as a structured, API‑first service using Node.js/Express and designed for team‑scale collaboration and predictable delivery.
My Role
I served as the technical lead for the backend, shaping the project’s architecture, workflow, and engineering standards. My contributions included:
- Introducing and driving the adoption of Express.js for the backend
- Setting up a Docker‑based development and deployment workflow
- Establishing a monorepo structure for shared code and consistent versioning
- Leading the team into a Scrum workflow (two‑week sprints)
- Enforcing peer‑review culture, ensuring that nobody merged their own MR without review
- Providing architectural guidance during the early system design phase
Core Functionality
- Competency progression tracking: Students could navigate through their assigned competencies (e.g., A1 → A1.1), log completion, and attach evidence links.
- Role integration with internal systems: Worked with my coach to connect to the internal company server to determine whether a user was a coach or an apprentice.
- Progress storage via MongoDB: Stored entries, proofs, and competency updates; only minimal DB setup required beyond inserting and querying required data.
Features
- REST API for tracking competencies, learning goals, and progress entries
- MongoDB data model optimised for timeline‑based querying
- Role‑based access patterns for students, teachers, and administrators
- Structured evaluation logic to aggregate and represent competency development
- Modular controllers for clean separation of routes, logic, and validation
- DTO‑style request validation for predictable API behaviour
Architecture
The backend is structured into clear layers, making it easy to maintain and extend:
- Routing Layer: Express routers grouped by domain (competencies, users, tracking entries)
- Controller Layer: Encapsulates request handling and input sanitisation
- Service Layer: Contains the core evaluation logic and business rules
- Database Layer (MongoDB): Mongoose models with schema validation
- Shared Modules (Monorepo): Common utilities, typing, and config shared across services
Development Workflow
- Monorepo with shared modules for consistent tooling
- Dockerised environment for onboarding‑friendly setup
- Two‑week Scrum sprints, releasing to
mainafter each sprint - Mandatory code reviews to maintain quality across the team
Deployment & Operations
Although the company had no CI/CD pipelines, I ensured stable production deployments:
- SSH-based deployment workflow: Connected to the server, pulled updates, and coordinated releases.
- Docker Compose orchestration: Rebuilt images and launched the production stack with correct environment variables.
- NGINX reverse proxy + HTTPS: Configured NGINX for secure routing and TLS termination.
- Consistent release cycle: Deployed updates at the end of each two-week sprint.
Key Decisions
- Choosing Express.js for its simplicity, flexibility, and low learning curve for the team
- Adopting Docker early to eliminate environment drift
- Structuring the project as a monorepo to avoid duplicated logic and config
- Introducing Scrum and MR reviews to ensure steady, high‑quality delivery
Challenges / Lessons Learned
- Establishing a review culture required deliberate guidance, but dramatically improved quality
- Switching to Docker early reduced onboarding friction and environment inconsistencies
- The monorepo introduced a learning curve but simplified scaling as the project grew
- Early architectural decisions (Express + MongoDB) paid off by keeping complexity low