Read your project before asking AI.

Keneil is a conversation interface for source code. It reads. It understands. It discusses. Nothing is modified without your intent.

  • local-first
  • read-only
  • git-first
keneil
keneil · 1 file · digest· 9%

$ @src/auth.js | ask "What does this module do?"

 

keneil > auth.js is the authentication layer.

It validates JWT tokens and hydrates user sessions on each request.

 

The module is read-path only - it never writes to the database directly.

 

↳ auth.js · chunk 2/6 · token validation

● auth.js · digest9% █░░░░░░░

Quick Start

Up and running in minutes.

1. Install Ollama
   https://ollama.com/download

2. Pull the local model
   $ ollama pull qwen2.5-coder:7b
   pulling manifest... done

3. Install Keneil
   $ npm install -g git+https://gitlab.com/filum.work/keneil.git
   added 1 package in 2.3s

4. Start Keneil
   $ keneil
   keneil alpha.1 - ready
   model qwen2.5-coder:7b · read-only
   ▸ Ask anything about this project.

you > _

Runs entirely on your machine. No cloud connection required.

Compatible with: Debian/Ubuntu · macOS 12+ · Windows 11 (WSL2)

Estimated time: under 5 minutes.

Keneil requires Ollama. The local model runs on your hardware.

How it works

The model only sees what you give it.

The model only sees what you explicitly share. No hidden indexing. No remote analysis. No cloud synchronization. You choose which files enter the conversation. You control what gets discussed.

  1. Your codebase
  2. Digest
  3. Working set← you choose the exact windows
  4. Local LLM (Ollama)
  5. Answer
  6. Your decision

Navigation

Type @ to open the file picker. Search by route, not by filename. In an Astro project with dozens of index.astro files, Keneil shows /blog/[slug] → page, not a list of identical filenames. The path IS the context.

@ - open · ↑↓ - navigate · Enter - select
keneil
keneil · 2 files in focus1 file omitted · 100%

$ ok, now - which files are loaded in @ ?

keneil > Based on active context:

src/router.js - loaded as source, visible lines 1-180

src/api.js - loaded as source, visible lines 1-220

src/auth.js - partially sent

Files out of focus are omitted from context.

$ which selectors can I use here ?

keneil > context switched: project keneil, thread new

keneil > active focus

src/router.js

src/api.js

$ @{ _0/18 · selectors @{...}

[ ] bin/app.js · entry

[ ] src/config.js · source

[x] src/router.js · source

[ ] src/api.js · source

[ ] src/auth.js · source · Loaded

[ ] src/db.js · source

↑↓ navigate · Space select · Enter confirm · Esc close
● router.js · source+ 0 selected
keneil
keneil · workspace· 100%

$ Ctrl+K

keneil > project

keneil

docs-site

 

keneil > threads

new

auth-refactor

KSL

poc

test

 

Enter open · Esc close

✓ KSL-runner.js · digest✓ KSL.js+1 not sent

Workspace

Your work, organized by thread.

Every conversation belongs to a thread. Threads belong to projects. Switch threads and projects from the command palette (Ctrl+K) or the shell. Each thread remembers which files were loaded and at what depth.

Discussion is a feature.

Software is easier to change once it is understood. Developers spend more time reading code than writing it. That time - the gap between opening a file and knowing how to change it safely - is where Keneil lives.

A conversation forces you to articulate the question. Articulating the question often reveals the answer. Keneil exists to improve the understanding half of development, not the editing half. Informed edits over faster edits.

"Read before rewrite."

In Practice

Real conversations.

keneil
keneil · 2 files · digest18%

$ @{src/router.js, src/api.js} | digest | ask "How are routes connected to handlers?"

 

keneil > Routes are registered in router.js using a declarative map.

Each route points to a named handler in api.js.

No middleware chaining - handlers are pure functions.

 

↳ router.js · chunk 2/6 · route declarations

↳ api.js · chunk 1/4 · handler registry

● router.js · digest● api.js · digest18% ██░░░░░░
keneil
keneil · 3 files · digest47%

keneil > working set:

src/auth.js digest ✓ 8 chunks

src/session.js digest ✓ 5 chunks

src/db.js brut · 3 240 tokens

 

$ @{src/auth.js, src/session.js} | ask "Where is the token validated?"

_

● auth.js · digest● session.js · digest● db.js · brut47% █████░░░
keneil
keneil · src/auth.js · digest9%

$ @src/auth.js | ask "Is this safe to refactor?"

 

keneil > Yes. auth.js has no side effects outside its own scope.

It reads from the session store but never writes.

 

Safe to refactor in isolation.

 

↳ auth.js · chunk 3/8 · token validation

● auth.js · digest9% █░░░░░░░

Principles


01 · Read first

The model only sees what you explicitly provide. No automatic scanning, no hidden indexing.


02 · Think locally

Built for Ollama and local model workflows. Your code never leaves your machine.


03 · Keep control

No autonomous edits. Every change is a human decision. Git remains the source of truth.


04 · Stay small

A simple terminal is often enough. No GUI, no plugin system, no telemetry.

Why read-only?

Developers should trust their tools. Trust comes from transparency. A tool that cannot modify your files is a tool you can leave running without anxiety.

Keneil discusses. Developers decide. The moment a tool begins making decisions autonomously - even small ones - the developer becomes an operator instead of a craftsman. Keneil is not an operator. It is a well-read collaborator.

Keneil never creates files. Never commits. Never stashes. Never rebases. Read-only is not a limitation - it is the design.

Languages carry memories.

"Keneil" is a Breton word meaning "colleague". We chose it because we believe technology doesn't have to erase local cultures. Sometimes, it can quietly help them live on.