CareerForge
Info Portal

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

Last updated: 27 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 — with per-feature TTL, guardrails, and model overrides. Read the AI Deep Dive →
⚙️
AI Workflow Connector
Admins configure which AI provider (Anthropic, OpenAI, Perplexity, Gemini, or self-hosted Ollama/vLLM) drives all suggestions. One active config at a time. Every AI call is logged in an append-only audit trail.

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)
  • Mentor MatcherGET /employees/{pseudo_id}/mentor-suggestions?top_n=N — scores available mentors against a given employee using skill overlap (55%), seniority fit (30%), and load (15%); returns ranked list with match %, skill overlap, seniority gap, and active assignment count
  • Market intelligence and AI coaching advice (per-feature TTL from active AI Workflow Config)
Manager Service  :8004 / manager-service

Practice Manager views. Verifies JWTs from the employee Keycloak realm; additionally requires the manager realm role. Runs as a separate image: careerforge-manager-backend:latest.

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)
  • Opportunity Publishing — Managers create and publish opportunities of type project, bench, lnd, rnd, or role; includes publish/unpublish lifecycle
  • AI Candidate MatchPOST /opportunities/{id}/ai-match — deterministic skill-overlap scoring across all employees + AI narrative for top 3 candidates; results cached per the opportunities_ai_match feature TTL from the active AI Workflow Config
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
  • AI Workflow Connector — Full CRUD for AIWorkflowConfig records; activate/deactivate; per-feature coverage config (TTL, guardrails, model override per feature per portal); self-hosted LLM support via base_url; sources catalog endpoint; AI suggestion audit log browser

AI Workflow Config structure

The active config drives every AI call across all portals. Coverage config structure:

{
  "employee": {
    "role_suggestions":       { "enabled": true, "ttl_hours": 24, "guardrails": { "max_roles": 5, "min_match_score": 0.3 }, "model_override": null },
    "learning_path":          { "enabled": true, "ttl_hours": 48, "guardrails": { "max_nodes": 12, "include_certs": true }, "model_override": null },
    "opportunities_matching": { "enabled": true, "ttl_hours": 6, ... },
    "ai_chat":                { "enabled": true, "ttl_hours": 1, ... }
  },
  "coach": {
    "coaching_advice":   { "enabled": true, "ttl_hours": 4, "guardrails": { "require_pseudo_id": true, "safe_mode": true }, ... },
    "market_intelligence": { "enabled": true, "ttl_hours": 6, ... },
    "mentor_matching":   { "enabled": true, "ttl_hours": 24, "guardrails": { "min_match_score": 0.2, "max_mentors": 5 }, ... }
  },
  "manager": {
    "team_readiness":         { "enabled": true, "ttl_hours": 24, "guardrails": { "show_names": false }, ... },
    "opportunities_ai_match": { "enabled": true, "ttl_hours": 2, "guardrails": { "max_candidates": 10, "min_match_score": 0.3 }, ... }
  }
}

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

Manager Opportunity & AI Match Flow

Manager Creates Opportunity
Publishes (project / bench / lnd / rnd / role)
AI Match triggered
Skill-overlap scored vs all employees
Ranked candidates + AI narrative (top 3)

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).

Mentor Matcher

On any employee's detail page, the Mentor Match card shows the top-N mentors best suited to that employee — ranked by a weighted score:

Mentors are only considered if they have available_for_mentoring = true and are at equal or higher seniority than the employee. Match scores are colour-coded: green ≥70%, yellow 40–69%, grey <40%.

AI Coaching Advice

On an employee's detail page, enter a coaching question — the AI receives the employee's anonymised profile (pseudo-id only) and returns market-grounded, auditable advice. Every call is logged in the AI suggestion audit trail. The TTL and guardrails for coaching advice are configurable per-feature in the Admin → AI Workflow Connector.

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

Opportunities

Managers can create and publish opportunities visible to all employees in the Employee Portal.

Create Opportunity

Set title, description, required skills, type (project, bench, lnd, rnd, role), and seniority range. New opportunities start as draft — not yet visible to employees.

Publish / Unpublish

Click Publish to make the opportunity live in the Employee Portal. Use Unpublish to pull it back without deleting it.

AI Candidate Match

Click AI Match on any opportunity. The system scores all employees by skill overlap and returns a ranked candidate list with match percentages, matched skills (green), and missing skills (strikethrough). The top 3 candidates also receive an AI-generated narrative. Results are cached per the opportunities_ai_match TTL in the active AI Workflow Config.

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

AI Workflow Connector

Configure which AI engine drives all CareerForge suggestions. Navigate to Connectors → AI Workflow tab.

Privacy note: Audit log entries use pseudo-ids, not PII. The log cannot be modified or deleted through the UI.

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
GET/employees/{pseudo_id}/mentor-suggestions— Top-N mentor fits for an employee (score = skill overlap 55% + seniority fit 30% + load 15%)
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
GET/opportunities— List all opportunities (draft + published)
POST/opportunities— Create opportunity (type: project/bench/lnd/rnd/role)
PATCH/opportunities/{id}— Update opportunity details
POST/opportunities/{id}/publish— Publish (makes visible to employees)
POST/opportunities/{id}/unpublish— Unpublish (returns to draft)
DELETE/opportunities/{id}— Delete opportunity
POST/opportunities/{id}/ai-match— AI candidate matching: skill-overlap score for all employees + narrative for top 3
Admin Service — admin-career.k8s.openstack.lupulup.com/api/v1/admin
GET/ai-workflows— List all AI Workflow configs
POST/ai-workflows— Create AI Workflow config
PUT/ai-workflows/{id}— Update config (provider, model, coverage, base_url)
POST/ai-workflows/{id}/activate— Activate config (deactivates all others)
DELETE/ai-workflows/{id}— Delete config
GET/ai-workflows/sources-catalog— Available data sources for AI grounding
GET/ai-suggestion-logs— Paginated suggestion audit log (filter by type/portal/feature/date)

Users & Roles

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

Administrators (admin realm)

UsernameRolePortalPassword
admin.hrHR Administratoradmin-career.k8s.openstack.lupulup.comTest1234!
admin.platformPlatform Administratoradmin-career.k8s.openstack.lupulup.comTest1234!
admin.orgOrg Administratoradmin-career.k8s.openstack.lupulup.comTest1234!
admin.lndL&D Administratoradmin-career.k8s.openstack.lupulup.comTest1234!

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!
adminadmin.hr, admin.platform, admin.org, admin.lndTest1234!

Container Registry

Registrygit.lupulup.com
Namespaceadmin/
Imagescareerforge-backend:latest, careerforge-employee:latest, careerforge-coach:latest, careerforge-manager:latest, careerforge-admin:latest, careerforge-manager-backend:latest (manager API — separate image)

Kubernetes

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