A from-scratch coding agent — bring your own OpenRouter API key
Project description
██╗ ███████╗████████╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗
██║ ██╔════╝╚══██╔══╝██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔════╝
██║ █████╗ ██║ ███████╗██║ ██║ ██║██║ ██║█████╗
██║ ██╔══╝ ██║ ╚════██║██║ ██║ ██║██║ ██║██╔══╝
███████╗███████╗ ██║ ███████║╚██████╗╚██████╔╝██████╔╝███████╗
╚══════╝╚══════╝ ╚═╝ ╚══════╝ ╚═════╝ ╚═════╝ ╚═════╝╚══════╝
Building Claude Code from scratch — a minimal coding agent you own and understand.
What is this?
letscode is a coding agent built from first principles. It replicates the core loop of tools like Claude Code:
- You describe a coding task in plain English
- The agent calls tools (read files, list directories, edit files) to get the job done
- It keeps looping — reading, reasoning, editing — until the task is complete
The entire agent fits in a single file. No magic, no abstractions you didn't write yourself.
Features
- Model-agnostic — works with any model on OpenRouter: Claude, GPT-4o, Gemini, Llama, Mistral, DeepSeek, and more
- Free tier support — defaults to
meta-llama/llama-3.3-70b-instruct:free(no cost) - Three core tools built in: read files, list directories, edit files
- Text-protocol tool-calling — no vendor lock-in; the LLM emits tool calls as plain text
- Full conversation history — the agent remembers context across turns
Quickstart
1. Clone the repo
git clone https://github.com/srinivasankh/letscode.git
cd letscode
2. Set up your API key
Copy the example config and add your OpenRouter key:
cp .env.example .env
Edit .env:
OPENROUTER_API_KEY=sk-or-your-key-here
That's all you need. The default model is free — no credit card required.
3. Run it
uv run letscode
Or, if you prefer pip:
pip install -e .
letscode
Bring Your Own API Key (BYOK)
letscode routes all LLM calls through OpenRouter, which gives you a single API key that works with dozens of models.
Get a free key:
- Sign up at openrouter.ai
- Go to openrouter.ai/keys → create a key
- Paste it into your
.envfile asOPENROUTER_API_KEY
Choose your model by setting OPENROUTER_MODEL in .env:
# Free models (no cost)
OPENROUTER_MODEL=meta-llama/llama-3.3-70b-instruct:free
OPENROUTER_MODEL=google/gemma-3-27b-it:free
OPENROUTER_MODEL=deepseek/deepseek-r1:free
# Frontier models (paid, best quality)
OPENROUTER_MODEL=anthropic/claude-sonnet-4
OPENROUTER_MODEL=openai/gpt-4o
OPENROUTER_MODEL=google/gemini-2.5-pro
Browse all available models at openrouter.ai/models.
How it works
The agent runs a simple loop:
User input
└─▶ LLM reasons about the task
└─▶ Emits a tool call (e.g. tool: read_file({"filename": "app.py"}))
└─▶ Agent executes the tool
└─▶ Result fed back to LLM
└─▶ Repeat until done
Available tools:
| Tool | What it does |
|---|---|
read_file(filename) |
Read the full content of a file |
list_files(path) |
List files and directories at a path |
edit_file(path, old_str, new_str) |
Replace text in a file, or create a new file |
Project structure
src/letscode/
agent.py # the entire agent: tools, prompt, parser, loop
pyproject.toml # package config
.env.example # config template — copy to .env
Requirements
- Python 3.12+
- uv (recommended) or pip
- A free OpenRouter API key
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file letscode_cli-0.1.3.tar.gz.
File metadata
- Download URL: letscode_cli-0.1.3.tar.gz
- Upload date:
- Size: 30.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e745703aab09a6aaffc4a2fa47c7eebe2098d3f57477231e1ea3e5eb08419fd
|
|
| MD5 |
8494783aa255443aa372ce251133757a
|
|
| BLAKE2b-256 |
fca92f3b25fce1fbc063f93da87093b45ae6457f91c471b3c20cbb7d0d154a6b
|
File details
Details for the file letscode_cli-0.1.3-py3-none-any.whl.
File metadata
- Download URL: letscode_cli-0.1.3-py3-none-any.whl
- Upload date:
- Size: 8.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cdb5e0bb6a66198e0d3182547ed7d285f4e14721494b700f6962cb60d413de05
|
|
| MD5 |
e84f2f3b7ed71a7d237161ff5243268a
|
|
| BLAKE2b-256 |
b5867e3cad5d075cecafe2810e3a4a0a9977d2e6f7ecd6895e3cd1a459bbcca8
|