Skip to content

bounteer/bounteer.github.io

Repository files navigation

Bounteer

AI-Powered Recruitment Intelligence Platform

Bounteer is a modern recruitment intelligence platform that combines AI-driven candidate matching, real-time job description enrichment, and orbit signal tracking to help organizations identify and engage with top talent efficiently.

✨ Key Features

  • Orbit Call Management - Real-time job description enrichment and candidate search orchestration
  • AI-Powered Matching - Intelligent CV-to-JD matching with detailed role fit analysis
  • Role Fit Studio - Interactive workspace for evaluating candidate-role alignment
  • Cover Letter Generation - AI-generated, editable cover letters tailored to job descriptions
  • Orbit Signal Tracking - Monitor hiring intent signals with urgency tags and action quotas
  • WebSocket Integration - Real-time updates for candidate profiles and job enrichment
  • Space Management - Multi-tenant workspace system with role-based permissions
  • Previous Call History - Access and load past orbit call sessions

πŸ—οΈ Tech Stack

  • Framework: Astro with React components
  • Styling: Tailwind CSS + ShadCN/UI
  • CMS: Self-hosted Directus (directus.bounteer.com)
  • Package Manager: pnpm
  • Hosting: GitHub Pages (static site with client-side hydration)
  • Real-time: WebSocket subscriptions for live data updates

πŸ“¦ Project Structure

/
β”œβ”€β”€ public/             # Static assets
β”‚   └── favicon.svg
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ assets/         # Images and other assets
β”‚   β”œβ”€β”€ components/     # Reusable UI components
β”‚   β”œβ”€β”€ layouts/        # Page layouts
β”‚   β”œβ”€β”€ pages/          # Page routes
β”‚   β”œβ”€β”€ scripts/        # JavaScript utilities
β”‚   └── styles/         # Global styles
β”‚       β”œβ”€β”€ global.css
β”‚       └── transitions.css
β”œβ”€β”€ astro.config.mjs    # Astro configuration
β”œβ”€β”€ tailwind.config.mjs # Tailwind CSS configuration
└── package.json        # Project dependencies

πŸ—οΈ Component Architecture

OrbitCallDashboard Component

The main dashboard component for managing Bounteer orbit call, located at src/components/interactive/OrbitCallDashboard.tsx.

Key Features:

  • 3-stage workflow: not_linked β†’ ai_enrichment β†’ manual_enrichment
  • Real-time job description enrichment via WebSocket/polling
  • Candidate search integration with Directus CMS
  • Database-driven request system for external integrations

State Management:

  • Manages job description data as single source of truth
  • Handles orbit call session lifecycle
  • Coordinates candidate search requests and results

JobDescriptionEnrichment Component

A controlled component for job description form and AI enrichment, located at src/components/interactive/JobDescriptionEnrichment.tsx.

Design Pattern: Controlled Component

// Parent manages state and passes it down
<JobDescriptionEnrichment
  jobData={jobData}              // Props from parent (single source of truth)
  onJobDataChange={handleChange} // Callback to update parent
  stage={jdStage}
  // ... other props
/>

Props Interface:

interface JobDescriptionEnrichmentProps {
  jobDescriptionId: string | null;
  callUrl: string;
  inputMode: "meeting" | "testing";
  stage: JDStage; // "not_linked" | "ai_enrichment" | "manual_enrichment"
  jobData: JobDescriptionFormData; // Receives data from parent
  onStageChange: (stage: JDStage) => void;
  onJobDataChange: (jobData: JobDescriptionFormData) => void; // Notifies parent of changes
}

Data Flow:

  1. Parent β†’ Child: jobData prop provides current state
  2. Child β†’ Parent: onJobDataChange() callback updates parent state
  3. Real-time updates: WebSocket/polling updates flow through parent
  4. Candidate Search: Uses parent's jobData (always in sync)

Features:

  • AI/Manual enrichment toggle with conditional editing
  • Real-time updates via WebSocket or polling (configurable)
  • Form validation for all job description fields
  • Save functionality with change tracking
  • Skills management with drag-and-drop
  • Animated gradient background header

Why Controlled Component Pattern?

  • βœ… Single source of truth (parent state)
  • βœ… No duplicate state between parent and child
  • βœ… Predictable data flow
  • βœ… Ensures candidate search gets correct data
  • βœ… Easier to debug and maintain

Data Flow Diagram

OrbitCallDashboard (Parent)
    β”‚
    β”œβ”€β”€β”€ jobData state (source of truth)
    β”‚
    β”œβ”€β†’ JobDescriptionEnrichment (Child)
    β”‚       β”‚
    β”‚       β”œβ”€ Receives: jobData prop
    β”‚       β”œβ”€ Renders: form with current data
    β”‚       └─ Updates: calls onJobDataChange()
    β”‚
    └─→ Candidate Search Request
            β”‚
            β”œβ”€ Creates: orbit_candidate_search_request record
            β”œβ”€ Snapshot: jobData at request time
            └─ Monitors: request status via WebSocket

🧞 Commands

All commands are run from the root of the project, from a terminal:

Command Action
pnpm install Installs dependencies
pnpm dev Starts local dev server at localhost:4321
pnpm build Build your production site to ./dist/
pnpm preview Preview your build locally, before deploying

🎨 Customization

Colors

The template includes a custom color palette defined in tailwind.config.mjs:

But I am transitioning to use ShadCN just to make my life easier. I am just a frontend vibe coder.

# add new shadcn component
pnpm dlx shadcn@latest add badge

πŸ“‹ Development Roadmap

See TODO.md for:

  • Security issues and fixes
  • Feature Development: Upcoming features including Orbit Call Candidate Mode
  • Implementation checklists and architecture documentation

πŸš€ Getting Started

  1. Clone this repository
  2. Install dependencies with pnpm install
  3. Start the development server with pnpm dev
  4. Visit http://localhost:4321 to see your site

πŸ‘€ Tech Stacks

Orbit Signal – Final Model Summary

The system is reference-centric, not entity-centric. Identity is handled by company_reference (stable, enrichable handle). Knowledge snapshots live in company_profile (replaceable, enrichable). Beliefs / hypotheses live in hiring_intent. Edit ownership is per space, so hiring_intent is owned by space. Duplication is allowed; no global dedup or reconciliation is required. hiring_intent β†’ company_profile β†’ company_reference is the core chain. Queries and UI can safely use intent.company_profile.*. Spaces organize and edit beliefs; they do not own identity or profiles. The resulting graph is a space-scoped belief graph, not a global truth graph.

Orbit Signal Workflow & Limits

Urgency Tag System

Each signal card displays an urgency tag next to the signal strength badge, showing days to maturity based on the hiring window:

Color Coding:

  • Gray - "Xd to start" - Before hiring window begins
  • Green - "Xd left" - During hiring window with more than 14 days remaining
  • Yellow - "Xd left" - During hiring window with 14 days or less remaining (urgent)
  • Red - "Expired" - After hiring window has ended

Purpose:

  • Provides at-a-glance visibility of signal timing and urgency
  • Helps prioritize which signals need immediate attention
  • Prevents missing hiring windows for high-value opportunities
  • Automatically calculates days based on predicted_window_start and predicted_window_end

Implementation: src/components/interactive/SignalCard.tsx:44-90

Action Quota Limit

To prevent signal/action accumulation and encourage timely follow-through:

Limit: Maximum of 10 actions in the Actions column at any time

Behavior:

  • When attempting to move a signal to actions with 10 existing actions, a dialog appears
  • Message: "You have exceeded the maximum of 10 actions. Please complete or abort existing actions first before adding new ones."
  • User must complete or abort actions to free up slots

Why this limit exists:

  • Prevents overwhelming action lists that lead to inaction
  • Encourages users to actively manage and close out actions
  • Promotes focused work on high-priority signals
  • Prevents signals from "hanging" indefinitely without resolution

Implementation: src/components/interactive/HiringIntentDashboard.tsx:180-185

πŸ“– Version History

See CHANGELOG.md for detailed release notes.

Latest Release: v0.8.0 - Schema optimization and migration to integer-based source IDs

Recent Major Updates:

  • v0.7.0 - Real-time candidate profile enrichment with WebSocket subscriptions
  • v0.6.0 - Previous orbit call history and WebSocket heartbeat implementation
  • v0.4.0 - Role Fit Index with LinkedIn URL support and rainbow effects
  • v0.3.0 - Role Fit Studio launch
  • v0.2.0 - AI-powered cover letter generation

πŸ”— Dependencies & External Services

  • CMS: Self-hosted Directus
  • Icons: Lucide React
  • Forms: React Hook Form with Zod validation
  • UI Components: ShadCN/UI component library

πŸ“„ License

Copyright Β© 2025 Bounteer. All rights reserved.

About

Bounteer website built on Astro + Tailwind

Topics

Resources

Stars

Watchers

Forks

Contributors