# How the Frontend of the ai-job-search Application Is Built: TypeScript CLI Architecture

> Discover how the ai-job-search frontend uses TypeScript CLI architecture. Explore its Node.js execution and Thin-Pointer Design for efficient job searching.

- Repository: [Mads Lorentzen/ai-job-search](https://github.com/MadsLorentzen/ai-job-search)
- Tags: architecture
- Published: 2026-07-25

---

**The frontend of the ai-job-search application consists entirely of TypeScript-based command-line interfaces organized under a Thin-Pointer Design, with user-facing commands located in `.agents/skills/` directories and executed via Node.js rather than through a browser-based graphical interface.**

The ai-job-search repository by MadsLorentzen implements a non-traditional frontend architecture that prioritizes automation and scriptability over visual interaction. Instead of rendering HTML pages in a browser, the application exposes job search functionality through modular command-line tools written in TypeScript. This design allows users to interact with LinkedIn, Jobdanmark, and other job portals directly from the terminal using structured JSON outputs.

## CLI-First Frontend Architecture

Unlike conventional web applications that rely on React, Vue, or HTML rendering, the frontend of the ai-job-search application is purely text-based. The interface is implemented as a suite of **command-line tools** that accept parameters via command-line flags and return results as JSON or plain text. This architecture eliminates browser dependencies and enables seamless integration with shell scripts and automation pipelines.

## Thin-Pointer Design Pattern

The frontend follows the **Thin-Pointer Design** documented in [`AGENTS.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/AGENTS.md). In this architectural pattern:

- **User-facing commands** live in the hidden `.agents/skills/` directory as lightweight implementations
- **Canonical specifications** are stored separately under `.claude/`

This separation ensures that each CLI tool remains focused while maintaining clear specifications elsewhere. Each job portal integration (e.g., LinkedIn, Jobdanmark) is isolated in its own folder under `.agents/skills/`, functioning as an independent TypeScript project with minimal dependencies.

## TypeScript CLI Structure

Each CLI module follows a consistent structure with independent configuration and dedicated entry points:

- **Configuration Files**: Individual [`tsconfig.json`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tsconfig.json) files for each skill directory (e.g., [`.agents/skills/linkedin-search/cli/tsconfig.json`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.agents/skills/linkedin-search/cli/tsconfig.json))
- **Entry Points**: [`index.ts`](https://github.com/MadsLorentzen/ai-job-search/blob/main/index.ts) files serve as the CLI entry points (e.g., [`.agents/skills/linkedin-search/cli/index.ts`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.agents/skills/linkedin-search/cli/index.ts))
- **Test Suites**: Contract tests located in [`tests/cli-contract.test.ts`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tests/cli-contract.test.ts) files within each CLI directory
- **Execution Environment**: Run via Node.js using `tsx` or `ts-node`, or packaged as npm executables

The **Jobdanmark** search CLI mirrors this structure with [`.agents/skills/jobdanmark-search/cli/tsconfig.json`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.agents/skills/jobdanmark-search/cli/tsconfig.json) and [`.agents/skills/jobdanmark-search/cli/index.ts`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.agents/skills/jobdanmark-search/cli/index.ts).

## Running the Frontend Commands

Users interact with the frontend by invoking TypeScript files directly through Node.js. The commands accept portal-specific flags and return JSON arrays of job postings that can be piped into other tools or consumed by higher-level workflow scripts.

### LinkedIn Search Execution

```bash
npx tsx .agents/skills/linkedin-search/cli/index.ts --query "Data Scientist" --location "Copenhagen"

```

### Jobdanmark Search Execution

```bash
npx tsx .agents/skills/jobdanmark-search/cli/index.ts --keyword "Software Engineer" --city "Aarhus"

```

Both commands output matched job postings as formatted JSON. This output format supports integration with data processing pipelines and automated workflow scripts located elsewhere in the repository.

## Key Frontend Implementation Files

| Purpose | File Path |
|---------|-----------|
| LinkedIn CLI Entry Point | [`.agents/skills/linkedin-search/cli/index.ts`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.agents/skills/linkedin-search/cli/index.ts) |
| LinkedIn TypeScript Configuration | [`.agents/skills/linkedin-search/cli/tsconfig.json`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.agents/skills/linkedin-search/cli/tsconfig.json) |
| LinkedIn Contract Tests | [`.agents/skills/linkedin-search/cli/tests/cli-contract.test.ts`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.agents/skills/linkedin-search/cli/tests/cli-contract.test.ts) |
| Jobdanmark CLI Entry Point | [`.agents/skills/jobdanmark-search/cli/index.ts`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.agents/skills/jobdanmark-search/cli/index.ts) |
| Jobdanmark TypeScript Configuration | [`.agents/skills/jobdanmark-search/cli/tsconfig.json`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.agents/skills/jobdanmark-search/cli/tsconfig.json) |
| Jobdanmark Contract Tests | [`.agents/skills/jobdanmark-search/cli/tests/cli-contract.test.ts`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.agents/skills/jobdanmark-search/cli/tests/cli-contract.test.ts) |
| Architecture Documentation | [`AGENTS.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/AGENTS.md) |
| General Repository Documentation | [`README.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/README.md) |

## Summary

- The frontend of the ai-job-search application is built as **modular TypeScript CLI tools** rather than a traditional web interface
- Commands follow the **Thin-Pointer Design**, with implementations in `.agents/skills/` and specifications in `.claude/`
- Each job portal integration is an **independent TypeScript project** with its own [`tsconfig.json`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tsconfig.json) and test suite
- Users execute commands via `npx tsx` or Node.js, receiving **JSON output** suitable for scripting and automation
- The architecture currently supports **LinkedIn** and **Jobdanmark** searches through isolated CLI modules under `.agents/skills/`

## Frequently Asked Questions

### Does the ai-job-search application have a web interface?

No. According to the source code analysis, the repository does not ship with a graphical web front-end. All user interaction occurs through command-line interfaces written in TypeScript, which accept flags like `--query` and `--location` and return structured JSON results that can be consumed by other terminal tools.

### What is the Thin-Pointer Design pattern used in the frontend?

The Thin-Pointer Design is an architectural pattern where lightweight user-facing commands live in `.agents/skills/` while canonical specifications are maintained separately under `.claude/`. This separation keeps CLI implementations modular and focused, allowing each job portal integration to function as an independent TypeScript project.

### How do I run the frontend commands locally?

Execute the TypeScript files directly using Node.js with the `tsx` loader. From the repository root, run commands such as `npx tsx .agents/skills/linkedin-search/cli/index.ts` followed by appropriate query flags. Each skill directory contains its own [`tsconfig.json`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tsconfig.json) for TypeScript compilation settings.

### Why does the frontend use TypeScript CLI tools instead of a web framework?

The TypeScript CLI approach prioritizes **automation and scriptability** over visual interaction. This design enables users to pipe JSON outputs directly into other command-line tools, integrate searches into CI/CD pipelines, and run job queries without browser overhead or HTML rendering dependencies.