CareerForge
Info Portal

Internal reference documentation for the CareerForge career development platform — architecture, user guides, forms workflows, and the complete user directory.

Last updated: 21 April 2026  ·  Internal use only

Table of Contents

What is CareerForge?

CareerForge is an internal career development platform for a software IT outsourcing company with eight engineering practices. It connects employees, coaches, and practice managers in a structured, data-driven growth workflow — from skill assessment through structured commitments to verified sign-off.

🎯
Career Development
Employees define career goals, track skill gaps, and commit to growth milestones with coach and manager oversight.
🤝
Coaching Relationship
Six specialist coaches create Individual Development Plans (IDPs) and 1-on-1 forms, guiding employees through structured programs.
📊
Manager Visibility
Practice managers see their team's readiness scores, pending sign-offs, and career progression in real time.
🤖
AI Coaching
AI-powered advice uses the employee's anonymised profile to suggest next skills, learning paths, and career moves.

Key Concepts

The Four Portals

CareerForge is delivered as four separate single-page applications, each scoped to one user role, with independent authentication.

Employee Portal
my-career.k8s.openstack.lupulup.com
Self-service career hub. View profile, explore opportunities, apply, view forms, give AI-assisted advice, and manage PII consent.
employee realm
Coach Portal
cc-career.k8s.openstack.lupulup.com
Coach workspace. Manage opportunities, review applications, create IDP/1-on-1 forms, track employee progress, and sign off on commitments.
coach realm
Manager Portal
manager-career.k8s.openstack.lupulup.com
Practice Manager view. Team overview, readiness scores, pending form sign-offs, and progression analytics — without raw PII.
manager role
Admin Portal
admin-career.k8s.openstack.lupulup.com
Platform operations. Skill taxonomy management, system analytics, bulk data import, model training triggers, and global audit log.
admin realm

System Architecture

CareerForge follows a microservices architecture deployed on Kubernetes. Each portal has a dedicated backend API service; a shared PostgreSQL database holds canonical state; Redis provides caching and session storage.

INGRESS CONTROLLER · nginx · *.k8s.openstack.lupulup.com EMPLOYEE PORTAL Next.js / React COACH PORTAL Vue 3 / Vite MANAGER PORTAL Vue 3 / Vite ADMIN PORTAL React / TypeScript EMPLOYEE SERVICE FastAPI · :8002 COACH SERVICE FastAPI · :8003 MANAGER SERVICE FastAPI · :8004 ADMIN SERVICE FastAPI · :8000 KEYCLOAK · auth.lupulup.com Realms: employee · coach · admin · OIDC PKCE flow POSTGRESQL 16 employees · coach_forms · audit_log AES-256-GCM PII encryption REDIS 7 Sessions · Consent tokens Cache & notifications ML LAYER scikit-learn · XGBoost · MLflow Readiness scores · Skill gap models GitOps: ArgoCD watches gitops/ overlays · Kustomize · base → staging → production

Backend Services

Each FastAPI service owns a bounded domain. Services share the same PostgreSQL database but access only their own tables.

Employee Service  :8002 / employee-service

Core employee operations. Verifies JWTs from the employee Keycloak realm. Decrypts PII only after consent token validation.

Responsibilities

  • Profile retrieval (anonymised by default, full PII with consent token)
  • Skill heatmap & readiness score aggregation
  • Opportunity discovery and application submission
  • AI coaching advice generation
  • PII reveal request (generates consent token via notification)
  • Audit log write for all employee actions
Coach Service  :8003 / coach-service

Coach workspace operations. Verifies JWTs from the coach Keycloak realm.

Responsibilities

  • Opportunity CRUD (create, list, accept/reject applications)
  • Form creation (IDP, 1-on-1, nomination, performance review)
  • Coach sign-off on committed forms
  • Team analytics (skill heatmap, applications pipeline, cohort readiness)
  • Employee profile lookup (anonymised or PII-unlocked)
Manager Service  :8004 / manager-service

Practice Manager views. Verifies JWTs from the employee Keycloak realm; additionally requires the manager realm role.

Responsibilities

  • Team member listing (filtered by line_manager_pseudo_id)
  • Team member detail view (readiness score, skills, active forms)
  • Manager sign-off on forms (after coach sign-off is done)
  • Pending sign-off queue
  • Team analytics (skill gaps, progression heatmap)
Admin Service  :8000 / admin-service

Platform administration. Verifies JWTs from the admin Keycloak realm.

Responsibilities

  • Skills taxonomy management (create, update, deprecate skills)
  • System-wide analytics and KPI dashboards
  • Bulk employee data import
  • Global audit log browser
  • ML model training job triggers
  • Keycloak user synchronisation

Authentication & SSO

All portals use OpenID Connect with PKCE (Proof Key for Code Exchange). No passwords are stored by CareerForge — credentials live in Keycloak.

Keycloak Realms

RealmUsed byIssuer URL
employeeEmployee Portal, Manager Portalhttps://auth.lupulup.com/realms/employee
coachCoach Portalhttps://auth.lupulup.com/realms/coach
adminAdmin Portalhttps://auth.lupulup.com/realms/admin

Manager Role Check

The Manager Portal uses the employee realm but additionally requires the manager realm role to be present in the JWT. If the user authenticates successfully but lacks this role, they are redirected to /access-denied.

OIDC PKCE Flow

Portal generates code_verifier + code_challenge

Stored in sessionStorage. Used for PKCE security.

Redirect to Keycloak authorize endpoint

With response_type=code, code_challenge_method=S256.

User logs in at Keycloak

Credentials never touch the portal app.

Callback with authorization code

Portal exchanges code + verifier for access_token + refresh_token.

Access token sent as Bearer on every API call

Backend validates signature against Keycloak's JWKS endpoint.

PII Privacy Model

Employee personally identifiable information (full name, email, phone) is stored encrypted with AES-256-GCM. The encryption key is derived per-employee and stored in a secrets manager.

Coaches and managers see only pseudo-ids by default. To reveal PII, the employee must explicitly approve a PII reveal request — a push notification is sent, and on approval a short-lived consent token is issued. The requesting party redeems the token to temporarily decrypt the profile.

Data Flow

Opportunity & Application Flow

Coach Creates Opportunity
Employee Discovers & Applies
Coach Reviews Application
Accepted / Rejected

Form Sign-off Flow

Coach Creates Form
Employee Commits
Coach Signs Off
Manager Signs Off
Form ACTIVE

Pseudo-ID Derivation

Each employee's identifier is derived deterministically from their Keycloak sub (UUID) using HMAC-SHA256 + Base32:

HMAC_KEY = bytes.fromhex("77b1c3ed6d3a24931aef148f4099eabc355c79de084f5c10701d5de6044d16f0")

def derive_pseudo_id(keycloak_sub: str) -> str:
    digest = hmac.new(key=HMAC_KEY, msg=sub.encode(), digestmod=hashlib.sha256).digest()
    encoded = base64.b32encode(digest[:4]).decode("ascii")[:5]
    return f"EMP-{encoded}"

This means pseudo-ids are stable (same sub → same id), reversible only by someone with the HMAC key, and safe to expose to coaches and managers.

Employee Portal Manual

The Employee Portal at my-career.k8s.openstack.lupulup.com is your personal career development hub. Sign in with your company SSO credentials (employee realm).

Dashboard

The dashboard shows your current readiness score (0–100), recent activity, skill heatmap, and quick links to pending actions. The readiness score is computed from your skills, certifications, education, learning history, and engagement.

My Profile

Skills & Heatmap

Opportunities

My Forms

AI Advice

Notifications

Coach Portal Manual

The Coach Portal at cc-career.k8s.openstack.lupulup.com is your workspace for managing employee development. Sign in with your coach realm credentials.

Dashboard

Overview of your active opportunities, pending applications, forms awaiting your sign-off, and cohort readiness trends.

Opportunities

Create Opportunity

Set title, description, specialisation tags, seniority range, and application deadline. Published immediately — employees can discover and apply.

Review Applications

See each applicant's pseudo-id, readiness score, and cover note. Request PII reveal if you need to contact them directly.

Accept or Reject

Accepted applicants are notified automatically. Rejected applicants receive a note. You can change decision while the opportunity is open.

Forms

Creating a Form

Select form type, target employee pseudo-id, and optionally assign a practice manager. Form types:

After creation, the form status is pending_commitment — waiting for the employee to commit.

Sign-off

Once the employee commits, the form appears in your Sign-off Queue. Review the commitment, add coach notes, and sign. The form then moves to the manager for final sign-off (if a manager is assigned).

Analytics

Manager Portal Manual

The Manager Portal at manager-career.k8s.openstack.lupulup.com gives Practice Managers visibility into their team's career progression. Requires the manager Keycloak role.

Role Requirement: Only employees with the manager realm role in the employee Keycloak realm can access this portal. If you see an "Access Denied" page, contact IT to have the role assigned to your account.

Dashboard

Summary of your team: total members, average readiness score, pending sign-offs, active IDPs, and recent form activity.

My Team

Sign-offs

Practice Managers

ManagerPseudo-IDPractice
alice.johnsonEMP-HCUZEFrontend
bob.smithEMP-OJ5RQBackend
chris.evansEMP-IRUKSCloud & DevOps
diana.morganEMP-EN5FUData Engineering
edward.hughesEMP-HZ2CCML / AI
fiona.taylorEMP-VGB6PMobile
grace.chenEMP-LNASWQuality Assurance
henry.kimEMP-LCJZVSecurity

Admin Portal Manual

The Admin Portal at admin-career.k8s.openstack.lupulup.com is for platform operations. Restricted to users in the admin Keycloak realm.

Caution: Admin operations affect all users. Destructive actions (bulk delete, model retrain, data purge) require confirmation and are irreversible.

Skills Taxonomy

System Analytics

Audit Log

ML Model Management

Forms & Commitments

Forms are the core unit of documented career development in CareerForge. Every form goes through a structured lifecycle from creation to full sign-off.

Form Lifecycle

CREATED
Coach creates form & assigns employee
PENDING COMMIT
Employee reads & commits to goals
COMMITTED
Coach sign-off queue
COACH SIGNED
Manager sign-off queue
ACTIVE
Live commitment, progress tracked

Form Types

TypeCreatorManager Sign-offTypical Content
idpCoachRequiredGoals, milestones, target skills, timeline, success criteria
one_on_oneCoachOptionalMeeting agenda, discussion points, action items, next meeting date
nominationCoachRequiredRole/programme being nominated for, justification, evidence
performance_reviewCoachRequiredCompetency ratings, strengths, development areas, overall rating

Commitment Object

When an employee commits to a form, a FormCommitment record is created:

{
  "form_id": "uuid",
  "employee_pseudo_id": "EMP-XXXXX",
  "status": "committed",          // or: in_progress, completed, abandoned
  "commitment_date": "2026-04-21T10:00:00Z",
  "employee_notes": "I accept and will focus on Kubernetes certification first.",
  "progress_percentage": 0,
  "milestones_completed": 0
}

API Reference

All services expose OpenAPI docs at /docs (Swagger UI) and /redoc (ReDoc). Base paths are /api/v1.

Employee Service — my-career.k8s.openstack.lupulup.com/api/v1
GET/profile— Own anonymised profile
GET/profile/full— Full profile with PII (requires consent token header)
GET/skills/heatmap— Own skill heatmap by domain
GET/readiness-score— Current readiness score breakdown
GET/opportunities— Browse open opportunities
POST/opportunities/{id}/apply— Submit application
DELETE/applications/{id}— Withdraw application
GET/forms— My assigned forms
POST/forms/{id}/commit— Commit to a form
POST/ai/advice— Request AI coaching advice
GET/notifications— Inbox (unread + read)
POST/notifications/{id}/respond— Approve or deny PII reveal
Coach Service — cc-career.k8s.openstack.lupulup.com/api/v1
POST/opportunities— Create opportunity
GET/opportunities— List own opportunities
GET/opportunities/{id}/applications— Applications for an opportunity
POST/applications/{id}/decide— Accept or reject application
POST/forms— Create form (IDP, 1-on-1, etc.)
GET/forms— All forms created by me
POST/forms/{id}/sign-off— Coach sign-off on committed form
GET/analytics/skills-heatmap— Cohort skill heatmap
GET/analytics/applications— Applications pipeline analytics
GET/analytics/readiness— Cohort readiness scores
Manager Service — manager-career.k8s.openstack.lupulup.com/api/v1
GET/team— List team members
GET/team/{pseudo_id}— Team member detail & readiness
GET/sign-offs— Pending sign-off queue
POST/sign-offs/{form_id}— Manager sign-off
GET/analytics/team— Team progression analytics

Users & Roles

Complete directory of all CareerForge users. The employee realm contains 81 users; the coach realm contains 6 coaches. All simulation accounts use the password Test1234!.

Coaches (coach realm)

UsernameFull NameSpecialisationKeycloak ID
coach.cloudLaura HarrisonCloud & DevOpsb90f52e7-e8d9-4869…
coach.dataMichael ThompsonData Engineering7976a884-4b7a-4fdb…
coach.engineeringSarah MitchellEngineering54f4ef02-38dc-40d8…
coach.leadershipJames CaldwellLeadershipdb22379a-b2ee-420e…
coach.pmoSophie BennettPMO4cfae39e-f856-4c7c…
coach.securityDaniel FosterSecurity21bc7b96-8e97-4dd1…

Employees (employee realm)

Username Pseudo-ID Job Title Seniority Specialization Reports To Keycloak Role

Access Credentials

Simulation Accounts (all portals)

RealmUsersPassword
employeeAll 81 employees listed aboveTest1234!
coachcoach.cloud, coach.data, coach.engineering, coach.leadership, coach.pmo, coach.securityTest1234!

Container Registry

Registrygit.lupulup.com
Namespaceadmin/
Imagescareerforge-backend:latest, careerforge-employee:latest, careerforge-coach:latest, careerforge-manager:latest, careerforge-admin:latest

Kubernetes

Clusterk8s.openstack.lupulup.com
Namespacecareerforge
ArgoCDhttps://argocd.lupulup.com