← Selected WorkDEV TOOLS / CLI
01

tlme

Ask AI from your terminal and get streamed answers inline. Multi-provider — Claude, OpenAI, Grok, Google AI Studio, OpenRouter — with zero npm dependencies.

NODE.JSCLIMULTI-LLMZERO-DEPS
Year
2026
Role
Personal
Type
DEV TOOLS / CLI
Visit live site ↗

Overview

A zero-dependency command-line tool that puts a multi-provider AI assistant one keystroke away. Ask a question — `tlme how do I undo the last git commit but keep changes` — and the answer streams back inline as it is generated. It speaks to Claude, OpenAI, Grok, Google AI Studio, and OpenRouter behind one interface, injects your OS, shell, and current directory into the system prompt so 'in this directory' questions get tailored commands, and stays clean when its output is piped.

The problem

Switching to a browser to ask a quick shell or code question breaks flow, and every existing CLI drags in a tree of dependencies — axios, commander, chalk, dotenv — for what is fundamentally an HTTP call. The goal was a single-file tool with no npm dependencies at all (native fetch and node:* only) that still streams tokens live, handles five providers with different request shapes and SSE dialects, and stores API keys safely.

Highlights

  • Zero npm dependencies — native fetch and node: modules only; no axios, commander, chalk, or dotenv.
  • Five providers behind one interface — Claude, OpenAI, Grok, Google AI Studio, and OpenRouter — with per-call --provider and --model overrides.
  • Hand-parsed Server-Sent Events stream: text deltas write to stdout as they arrive, so you read the answer while it is still being generated.
  • Interactive --setup wizard with a full-screen arrow-key picker and type-to-filter that fetches the live model list from your key, falling back to a numbered prompt on terminals without raw input.
  • Context-aware system prompt injects OS, shell, and working directory; TTY-aware output emits ANSI colors only to a terminal so piping stays clean.
  • Keys resolve env-var-first, then a chmod-600 config file — and --config show only ever prints masked keys.