Skip to content
$ jader.ms hire_me()
back to projects
case study · self-built · 2024 — present

Personal Agent A cross-device AI command center that actually runs my day.

Most "AI assistants" are demos. This one I use every day from my phone, my tablet, and my laptop — it owns my plan, my reminders, my Jira tickets, my Harvest time, my PR queue, and my Claude Code sessions across multiple client repos. ~75 tools, two LLM providers, three inbound channels.

01 · Dashboard — sprint progress, today's agenda, sessions, Harvest tracker, PR activity, AI cost
02 · AI Plan Builder — chat-refined day plan with reasoning per slot
03 · Cross-device Claude Code PTY — real session, streamed to any device with memory recall
04 · Telegram bot — proactive PR alerts, NL git Q&A, /terminal spawns Claude Code with live cost tracking
75+
agentic tools shipped
25+
REST routers
3
inbound channels (web, telegram, whatsapp)
2
LLM providers behind one registry
01/ Architecture

How it's wired

Browser / Mobile / Tablet           agent.mscodeit.com
         │
         ▼
┌───────────────────────────────────────────────────────────┐
│  Cloudflare Access (auth) + Cloudflare Tunnel          │
└───────────────────────────────────────────────────────────┘
         │
         ▼
┌───────────────────────────────────────────────────────────┐
│  Laptop Node.js service · port 4757                      │
│                                                           │
│   ┌─────────────┐  ┌─────────────┐  ┌──────────────────┐  │
│   │ WebSocket   │  │ REST API    │  │ Scheduler        │  │
│   │ PTY stream  │  │ ~25 routers │  │ cron + watchers  │  │
│   │ (xterm)     │  │             │  │                  │  │
│   └─────────────┘  └─────────────┘  └──────────────────┘  │
│                                                           │
│   ┌──────────────────────────────────────────────────┐    │
│   │ Agent tool loop · ~75 tools                     │    │
│   │ Claude / OpenAI · LLM registry · tool dispatcher │    │
│   └──────────────────────────────────────────────────┘    │
└───────────────────────────────────────────────────────────┘
         │
         ▼
   SQLite · clients · sessions · conversations · plan ·
   reminders · scheduled tasks · audit log · watchers
02/ Code

Patterns from the codebase

Adapted (not copy-pasted) from the Personal Agent — tool design, provider abstraction, NL parsing, real-time streaming.

01 · Tool design
tools.register({
  name: "schedule_task",
  description: "Schedule a reminder or action",
  input_schema: {
    type: "object",
    properties: {
      type: { enum: ["remind", "action"] },
      next_run: { type: "string", format: "date-time" },
      cron: { type: "string", description: "5-field cron" },
      instruction: { type: "string" },
    },
    required: ["type", "instruction"],
  },
  handler: scheduler.add,
});
75+ of these power my Personal Agent
02 · Multi-LLM registry
const llm = registry.get(client.default_llm);

const stream = await llm.stream({
  model: llm.defaultModel,
  system: client.systemPrompt,
  tools: tools.specsFor(client),
  messages,
  cache: { ttl: "5m" },  // prompt cache
});

for await (const block of stream) {
  if (block.type === "tool_use") {
    yield await tools.dispatch(block);
  }
}
swap providers per-client without touching the loop
03 · Natural-language → cron
const cron = await parseCron(input, {
  examples: [
    ["every weekday at 9am",     "0 9 * * 1-5"],
    ["first monday each month",  "0 9 1-7 * 1"],
    ["in 25 minutes",            "@once+25m"],
  ],
});

await scheduler.add({
  cron,
  type: "remind",
  instruction: "stand-up reminder",
});
users type 'every weekday at 9am'
04 · PTY streaming
const pty = node_pty.spawn(
  llmRegistry.spec(client).cli,   // claude / codex
  ["-c", "--cwd", client.path],
  { name: "xterm-256color", cols, rows }
);

ws.on("message", (data) => pty.write(data));
pty.onData((chunk) => ws.send(chunk));
real Claude Code sessions on any device
03/ Capabilities

What it does

AI Plan Builder

Asks Claude to draft my entire day around fixed meetings, ticket priorities, and pomodoro blocks. Two-column UI: I refine in chat, the proposed plan rebuilds on the right. One click writes it to the day.

Cross-device Claude Code PTY

Real Claude Code v2.1.123 (Opus 4.7, 1M context) running in the selected client folder, streamed over WebSocket to phone, tablet, or laptop. Memory recall on session start.

Sprint Board: Kanban + Gantt

Per-client sprint with grouped Kanban columns (Open / In Progress / Reopened / Pre-QA / Review / Blocked) and a Gantt view with progress %, overflow flags, and per-day ticket bars.

Multi-Source Calendar

Month and week views aggregating Outlook (iCal), Google, and personal calendars. Per-source toggles, color coding, and direct event-to-plan integration.

Watchers + Activity Feed

Background pollers for PRs, Jira, and calendars (e.g. 'PR watcher every 30 min'). New approvals, ready-to-merges, and review requests stream into the dashboard activity feed.

AI Cost Tracking + Daily Budget

Live token accounting per conversation. Per-day and per-month spend chart. Hits a configurable daily budget threshold → Telegram alert.

Morning Briefing + EOD Journal

Auto-generated daily summaries — morning briefing at 08:30 (today's plan, blockers) and end-of-day journal at 18:00 (what shipped, what's pending) — both delivered via Telegram.

Telegram Bot — Three Modes

Proactive: PR approvals, ready-to-merges, calendar reminders pushed as they happen. Conversational: natural-language git activity Q&A with cross-system Harvest auto-fill. /terminal: spawns a real Claude Code session with model picker, live cost tracker, End-session and /model upgrade — all from the phone. Plus WhatsApp via Baileys and voice input (Web Speech or OpenAI Whisper).

NL → Cron Scheduling

‘every weekday at 9am’, ‘in 25 minutes’, ‘first Monday each month’ — parsed to cron and dispatched by the scheduler. Reminders, actions, and watchers all run on the same engine.

04/ Stack

What it's built with

Backend
Node.js TypeScript Express-style routers SQLite node-pty WebSockets
AI
Anthropic SDK (Claude) OpenAI SDK Claude Code SDK Custom tool dispatcher Prompt caching
Frontend
Angular xterm.js WebSocket client Service workers
Mobile
Web Speech API Wake Lock PWA-style accessibility
Inbound
Telegram Bot API (long-poll) WhatsApp via Baileys
Infrastructure
Cloudflare Tunnel (cloudflared) Cloudflare Access Cron scheduler Action audit log
$ next.step()

Want something like this for your team?

I design and ship agentic systems that run in production — multi-LLM, observable, with proper auth. Tell me what you're trying to build.

Get in touch
Next case study
Project Delta — Multi-profile AI content production