← My work

Full-stack web product · Job-search operating system

Roleway

Roleway turns a scattered job search into focused Workspaces and clear next steps. Keep roles, interviews, people, and documents together, then ask its AI Agent to explore your search or prepare a Workspace, task, note, or Next Action for approval.

Contribution
Designed and built independently
Current state
Live · Open source · Self-hostable
Built with
Next.js · TypeScript · Tailwind · Supabase · Resend · PostgreSQL · OpenAI API · Anthropic API · Gemini API · OpenRouter · Turborepo · Zod · Vitest · Playwright

AI Agent

Explore your search, turn a request into a proposal, and stay in control of every saved change.

Choose Create or Explore

The + and / controls reveal supported actions. Explore helps prioritize work, prepare interview answers, and draft text from bounded Workspace and Opportunity context.

Fill the gaps through chat

Agent asks for missing details one at a time and clarifies the target Opportunity, Workspace, or date. It can propose a Workspace, task, note, or Next Action.

Approve the exact change

Review the destination and proposed fields before approval. Applied means the record was saved; Open takes you to the result. Expired or stale Next Action proposals require a fresh review.

Product showcase

Inside Roleway

Selected product surfaces and public demonstrations. Demo images use illustrative records; captions identify those examples.

Roleway public Agent demo gathering a Workspace objective in conversation before asking the user to review a proposal
01Conversational creation · illustrative public demoFull resolution ↗
Roleway Opportunities list showing an expanded Workspace rail, grouped stages, priorities, Next Actions, and due dates
02Workspace opportunitiesFull resolution ↗
Roleway Home view ordering overdue and current work beside Workspace details, pulse, and active Opportunities
03Workspace Home · illustrative public demoFull resolution ↗

Problem and response

The problem

A serious job search spreads across browser tabs, spreadsheets, calendars, documents, and notes. Different career targets blur together, follow-ups are missed, preparation loses context, and it becomes difficult to decide what deserves attention next.

The approach

An Account owns a Career Profile and multiple Workspaces, each with its own Jobs, Opportunities, preferences, people, documents, goals, and results. Home orders current work and each Opportunity retains its dossier and one Next Action. Agent helps users explore selected search context and create through conversation: clarify the destination, gather missing details, review the exact proposal, and open the saved result after approval.

The workflow

Capture, then commit

Save a listing to Inbox. Track it as an Opportunity when it deserves active work, with a stage and one concrete Next Action.

Prepare with the full record

Keep interviews, contacts, preparation tasks, and document versions connected to the right Opportunity and Workspace.

Know what needs attention

Home brings due work and upcoming interviews together. Notifications and Insights reflect activity recorded in the product.

Keep AI optional

Connect your own provider for Agent; core tracking works without it. Provider charges are separate from Roleway capacity limits.

Architecture

Roleway is a pnpm and Turborepo TypeScript monorepo. A Next.js application composes shared workflow rules and Zod schemas, while Supabase provides authentication, PostgreSQL, row-level security, and the durable records behind Workspaces and Agent runs.

  1. Next.js application

    Server Components load authenticated Workspace data and Server Actions handle mutations. Client components stay focused on interactive controls, editors, collection views, onboarding, and the installable PWA shell.

  2. Core and schema packages

    Opportunity transitions, workflow labels, Agent permissions, and Zod boundary schemas live in shared packages so domain rules can be tested independently of route components.

  3. Owner-scoped PostgreSQL

    Supabase migrations are the source of truth for Workspaces, Jobs, Opportunities, tasks, contacts, interviews, documents, notifications, analytics, and Agent records. Row-level security and server checks enforce ownership.

  4. Provider-neutral Agent boundary

    Next.js Server Actions gather bounded account context before one generation request through custom HTTP adapters for OpenAI, Anthropic, Gemini, OpenRouter, or compatible endpoints. Zod validates the structured answer and proposals before storage. Responses appear after completion; this implementation does not use Vercel AI SDK or token streaming. User-supplied credentials are encrypted with AES-256-GCM.

  5. Database-authorized Agent actions

    Agent proposes Workspaces, Opportunity tasks, Next Actions, and notes. Explicit approval invokes PostgreSQL functions that recheck ownership, proposal status, expiry, and domain rules in a transaction. Stale Next Action proposals are rejected instead of overwriting intervening edits. Explore uses bounded snapshots, not exhaustive account search. Documents contribute metadata; their full bodies, notes, activity history, and Help Center articles are not retrieved into model context.

Key product and engineering decisions

These decisions affect what users can do, where product rules live, and how the system handles failure or change.

Give each search its own Workspace

An Account can hold separate Workspaces for different career targets. Preferences, Jobs, Opportunities, documents, people, goals, notifications, and analytics stay isolated instead of becoming one shared junk drawer.

Separate discovery from committed work

A Job stores discovered listing data. Tracking it creates an Opportunity with a stage and one concrete Next Action, so the active list represents deliberate work rather than another bookmarks folder.

Prepare with Agent, approve every change

Core tracking works without AI. Create and Explore are discoverable from the same + and / menu. Agent asks for missing details in chat, then presents the exact destination, text, and date for approval. Applications and employer messages remain user actions.

Protect data at two boundaries

PostgreSQL row-level security scopes records to their owner and Workspace, while server actions independently authenticate callers and constrain mutations by owner and Workspace IDs.

What you can inspect

The live product and public repository provide concrete evidence of the implemented features, architecture, tests, and documentation.