AI-powered terminal assistant for developers and security professionals.
franki is an open source CLI that brings AI assistance directly to your terminal — for coding, CEH/pentesting, SOC analysis, and exam prep. It supports multiple free AI providers with automatic fallback when one hits a rate limit.
pipx install franki-cliWhy pipx? franki is a CLI tool.
pipxinstalls it in an isolated environment and puts thefrankicommand on your PATH — no venv setup needed.Install pipx first if you don't have it:
sudo apt install pipx && pipx ensurepath
Or with pip in a virtual environment:
python3 -m venv .venv && source .venv/bin/activate
pip install franki-cliAfter installing, run the setup wizard to add your API keys:
franki initfranki # launch interactive REPL
franki --version # print version
franki init # re-run setup wizard
franki config list # show config (keys masked)Inside the REPL:
explain how TCP handshakes work # plain message
@myfile.py refactor this function # inject a file into context
!nmap -sV 192.168.1.1 # run a shell command and analyse output
/skill pentest # switch skill
/help # show all commands| Skill | Purpose |
|---|---|
| coding | Code generation, review, debugging |
| pentest | CEH-aligned recon, exploitation, reporting |
| soc | Log analysis, alert triage, incident response |
| ceh | CEH v13 exam prep and flashcard quizzes |
franki works with multiple free AI APIs and automatically falls back when one hits a rate limit:
| Provider | Free tier | Get key |
|---|---|---|
| Groq | Yes | groq.com |
| Google Gemini | Yes | aistudio.google.com |
| OpenRouter | Free models available | openrouter.ai |
| DelkaAI | Self-hosted option | — |
Configure keys:
franki config set groq.api_key <key>
franki config set gemini.api_key <key>
franki config set openrouter.api_key <key>| Command | Description |
|---|---|
/clear |
Clear conversation history |
/compact |
Summarise history to save context |
/rewind |
Undo the last exchange |
/history |
Show current session log |
/context |
Show model, memory, tokens, search status |
| Command | Description |
|---|---|
/export |
Save session to Obsidian vault as markdown |
/copy |
Copy last AI response to clipboard |
/note <text> |
Save a timestamped finding note |
/report |
Generate a pentest or SOC report from the session |
/search <query> |
Web search via Tavily — injects results into context |
| Command | Description |
|---|---|
/skill <name> |
Switch skill: coding / pentest / soc / ceh |
/model <name> |
Switch AI model |
/scope <ip/cidr> |
Set pentest target scope |
/scope clear |
Remove active scope |
| Command | Description |
|---|---|
/quiz |
CEH v13 flashcard quiz mode |
/mitre <behaviour> |
Map a behaviour to MITRE ATT&CK |
/payload <type> |
Suggest payloads for an attack type |
/tools <task> |
Suggest the right tools for a task |
/explain <tool> |
Explain a tool, its flags, and usage |
| Command | Description |
|---|---|
/remember <fact> |
Save a fact to long-term memory |
/memories |
List all saved memory, scopes, skill usage, notes |
/forget <id|all> |
Remove a fact by id, or clear all memory |
| Command | Description |
|---|---|
/connect |
Show connection mode (delkaai / direct) |
/connect delkaai |
Switch to DelkaAI backend |
/connect direct |
Switch back to direct providers |
/init |
Re-run the API key setup wizard |
/config |
Open the config editor |
/providers |
Show provider status and configuration |
/help |
Show all commands |
/quit |
Exit (prompts to save session) |
franki automatically runs a web search and injects the results before the AI responds
when your message contains keywords like latest, current, today, news,
or a CVE ID (CVE-XXXX-XXXXX).
Requires a Tavily API key (TAVILY_API_KEY) or a connected DelkaAI backend.
franki remembers things across sessions:
/remember I use Python 3.11 and FastAPI
/remember my pentest lab is 10.10.10.0/24
/memories # view everything stored
/forget 2 # remove entry #2Stored facts, recent pentest scopes, skill usage, and notes are automatically injected into the system prompt at the start of every session.
Config is stored at ~/.config/franki/config.json.
franki config list # show all config (keys masked)
franki config set groq.api_key <key> # set a value
franki config get active_model # read a value
franki config reset # reset to defaultsMIT — see LICENSE