Owly is a terminal CLI that generates and maintains wikis for personal knowledge and code repositories, built on elph-agent and elph-ai. It is a Rust port of OpenWiki.
cargo install --locked owlyOr from this repo:
cargo install --path owly
# or
cargo run -p owly -- [OPTIONS] [MESSAGE]| Mode | Wiki location | Default |
|---|---|---|
| personal | ~/.owly/wiki/ |
yes |
| code | ./openwiki/ in the repository |
explicit |
Personal mode is the default when no mode is given. Code mode targets repository documentation and optional AGENTS.md / CLAUDE.md refresh blocks.
owly "What is in my wiki?" # personal chat (streams by default)
owly personal --init # bootstrap personal wiki
owly code --init # bootstrap repo openwiki/
owly --mode code --update # update repo docsPersonal brain
owly personal --init
owly personal --update
owly "Summarize my commitments"Repository docs
owly code --init
owly code --update
owly code "Document the API layer"Configure provider credentials interactively on first run, or set keys in ~/.owly/.env (see Configuration).
owly "Siapa kamu?" # stream assistant text to stdout
owly -p "Summarize what Owly can do" # print final output only
owly -v "Explain your tools" # stream + thinking on stderr
owly --stream -p "..." # force stream even with --printBare owly (no args) prints Interactive mode not yet implemented until the REPL ships.
--init requires an explicit mode:
owly personal --init
owly code --initFlags may follow the mode token (clap trailing_var_arg recovery):
owly personal --init --dry-run
owly code --update -powly --dry-run personal --init
owly --dry-run code --update
owly --dry-run "hello"owly --credentials # masked key / OAuth status
owly --helpowly auth list
owly auth configure git-repo
owly auth configure web-search
owly auth configure hackernews
owly ingest all
owly ingest web-search
owly cron list
owly cron pause web-searchNot supported in Owly: ngrok, auth tools, Slack/Gmail/Notion OAuth, ChatGPT subscription OAuth, LangSmith tracing UI.
After a successful docs write in code mode, Owly refreshes AGENTS.md / CLAUDE.md (OWLY:START/END blocks) and may create .github/workflows/owly-update.yml once.
CI examples: examples/ (GitHub Actions, GitLab CI, Bitbucket Pipelines).
| Variable | Description | Default |
|---|---|---|
OWLY_PROVIDER |
LLM provider | opencode |
OWLY_MODEL_ID |
Model id | big-pickle |
| Provider | Environment variable |
|---|---|
| OpenCode | OPENCODE_API_KEY |
| Anthropic | ANTHROPIC_API_KEY |
| OpenAI | OPENAI_API_KEY |
| OpenRouter | OPENROUTER_API_KEY |
GOOGLE_API_KEY |
|
| DeepSeek | DEEPSEEK_API_KEY |
| Groq | GROQ_API_KEY |
| Fireworks | FIREWORKS_API_KEY |
| Together | TOGETHER_API_KEY |
| Mistral | MISTRAL_API_KEY |
| Path | Purpose |
|---|---|
.env |
Provider keys and defaults |
wiki/ |
Personal wiki root |
owly.sqlite |
Chat session checkpoints (Turso) |
onboarding.json |
Personal onboarding + connector instances |
INSTRUCTIONS.md |
Personal wiki goals |
openwiki/
├── quickstart.md
├── .last-update.json
├── architecture/
├── workflows/
├── domain/
├── api/
├── operations/
├── integrations/
└── testing/
Chat (read-only): read, grep, find, ls, ask_text, ask_select, ask_confirm
Init / update (full): above plus bash, edit, write
Owly is organized in layers under owly/src/:
| Layer | Path | Role |
|---|---|---|
| CLI | cli/ |
Argument parsing, product subcommand routing |
| UI | ui/ |
Terminal output, stream rendering, spinners |
| App | app/ |
Use-cases: init, update, chat, ingest, cron |
| Wiki | wiki/ |
Docs domain: mode, prompts, metadata, snapshots |
| Agent | agent/ |
elph-agent integration and checkpoint listeners |
| Connectors | connectors/ |
Ingestion sources (git-repo, web-search, …) |
| Setup | setup/ |
Onboarding wizard, connector auth |
| Runtime | runtime/ |
Config, credentials, Turso session/checkpoint |
lib.rs re-exports stable paths (owly::config, owly::mode, …) for tests and integrations.
cargo build -p owly
cargo test -p owly
cargo nextest run -p owly --test cli_e2e_test # binary-level CLI smoke tests
cargo clippy -p owly --all-targets -- -D warnings
make check && make lint && make test # workspace gatesscripts/e2e_cli.sh exercises core flags, dry-run paths, trailing-flag recovery, auth / ingest / cron, connector configure + cron lifecycle, and ingest without LLM wiki writes. Live chat checks are optional.
cargo build -p owly --release
./owly/scripts/e2e_cli.sh
# → 106 assertions (no LLM), 5 chat cases skipped
# Live LLM chat (streams credentials from ~/.owly/.env; does not change isolated HOME)
OWLY_E2E_LLM=1 ./owly/scripts/e2e_cli.sh
# → 116 assertions, 0 skippedCovered surface (non-LLM unless noted):
- Core: bare
owly,--help/-h,--credentials,--init/--updatevalidation,-p,--mode - Flags:
--stream,--verbose,--modelId/--model=,--directory(trailing recovery) - Dry-run: personal/code init, update, chat; mixed flag order
- Product:
auth list|configure,ingest,cron list|pause|resume|delete, rejectedngrok/ OAuth providers - Connectors: configure
git-repo/web-search/hackernews,--force, ingest skip path - LLM (optional): personal chat stream / print / verbose / positional
- Original concept: OpenWiki (LangChain)
- Agent runtime: elph-agent
- LLM integration: elph-ai
Apache License 2.0. See LICENSE-APACHE and NOTICE.md.