GoodToKnow CLI manager for installing and running the local-first GTN runtime
Project description
GoodToKnow
A local-first discovery agent that uses your current work context to surface a short briefing of what you should know now, and co-evolves with you over time.
In 10 Seconds
GoodToKnow is for people who keep feeling, "I probably missed something useful adjacent to what I'm doing right now."
It runs locally, reads signals from your current work, uses Codex with web search to look outward, and produces a small ranked briefing instead of another infinite feed.
Think of it as a quiet research scout for your real work.
Installation
Recommended: install from PyPI
GoodToKnow is now distributed as the published goodtoknow-gtn package on PyPI. The supported end-user flow is:
uv pip install goodtoknow-gtn
gtn setup
gtn setup now handles the first-time GTN bootstrap flow directly in the CLI:
- initializes the GTN runtime under
~/.gtn - prompts for optional Notion output setup
- prompts for an optional initial user profile
If your environment does not expose the gtn command after pip install, invoke it via the Python environment directly or add that environment's script directory to your PATH.
From source
If you want to test local changes or develop GoodToKnow from the repository:
git clone https://github.com/qzzqzzb/good-to-know.git
cd good-to-know
uv build
uv pip install --upgrade --force-reinstall dist/goodtoknow_gtn-*.whl
gtn setup
Or inside a dedicated local virtual environment:
uv venv .venv
source .venv/bin/activate
uv pip install --upgrade --force-reinstall dist/goodtoknow_gtn-*.whl
gtn setup
What is GoodToKnow
GoodToKnow is for people who suspect they are missing useful things — tools, papers, updates, ideas, or opportunities adjacent to what they are already doing — but do not want another noisy feed.
It runs quietly in the background, uses your local context to look outward, and surfaces a small number of things that are actually worth your attention.
It collects local signals such as browser history and agent work episodes, which helps filter what gets surfaced.
Why people might want it:
-
Quiet by default
It is meant to run in the background without asking you to constantly manage it. -
Local-first privacy
Your personal context stays on your machine, so the system can learn from your activity without shipping private data away by default. -
Better recommendations over time
As you use it, provide feedback, and let it observe more of your context, it can gradually recommend things that fit you better. -
A briefing, not a feed
The goal is not to show you everything. The goal is to help you notice the few things you probably should know now. -
Connected to real work
Instead of generic discovery, it tries to tie recommendations to what you are actually building, reading, and thinking about.
Quick Start
Prerequisites
You currently need:
- macOS
uvcodex- a working local Codex login/auth setup
Optional but recommended:
- Notion MCP/auth if you want Notion output
Run
Run one immediate cycle:
gtn run
See current scheduler/runtime state:
gtn status
Schedule recurring runs:
gtn freq 1h
Stop future scheduled runs:
gtn stop
Upgrade GTN through PyPI:
uv pip install --python ~/.gtn/.venv/bin/python --upgrade goodtoknow-gtn
If you want to remove the GTN package itself:
uv pip uninstall goodtoknow-gtn
How It Works
GoodToKnow currently runs as a layered local system:
context- collects local signals such as browser history and agent work episodes
memory- stores normalized user context, findings, and feedback signals in a local memory runtime
discovery- uses Codex with web search to look outward based on current memory
runtime- orchestrates the loop
output- publishes recommendations to external surfaces such as Notion
The active stack is selected by bootstrap/stack.yaml.
The current default stack uses:
context/naive-contextmemory/mempalace-memorydiscovery/web-discoveryruntime/codex-agent-loopoutput/notion-briefing
What User Context GTN Currently Scans
Today, the default context stack is intentionally narrow and local-first. GTN does not try to ingest "everything on your machine." It currently scans a small set of local signals that are useful for guessing what you are working on right now.
1. Recent browser history
GTN currently reads recent local history from these browsers when their history databases exist on disk:
- Chrome
- Edge
- Brave
- Firefox
What it extracts from browser history:
- the page URL
- the page title when available
- the last-visit timestamp
- the browser source (
chrome,edge,brave, orfirefox)
What it does to normalize browser history before memory ingest:
- ignores internal browser pages such as
chrome://,edge://,brave://,about:, andfile:// - keeps only normal
http/httpspages - removes common tracking query parameters such as
utm_*,fbclid,gclid, and similar ad/referral markers - deduplicates by browser + normalized URL, keeping the most recent visit
- converts the result into compact
user_signalobservations rather than copying raw database rows into memory
Default browser-history collection window:
- look back: last 72 hours
- max retained observations per collection pass: 20
Important limitation:
- GTN currently uses browser history as a "what you touched recently" signal
- it does not fetch full page content from your browser history database
2. Recent coding-agent session activity
GTN also reads recent local session logs from coding agents, currently:
- Codex session logs under
~/.codex/sessions - Claude session logs under
~/.claude/projectsand~/.claude_bak/projects
The goal is not to store full transcripts in memory. Instead, GTN extracts compact observations about concrete work episodes.
For Codex sessions, GTN currently looks for:
- high-signal user prompts
apply_patchedits- write-like
exec_commandoperations such as file writes, file moves, redirects,mkdir,touch, and similar shell actions
For Claude sessions, GTN currently looks for:
- high-signal user prompts
- file-writing tools such as
Write,Edit, andMultiEdit - write-like
Bashcommands
How GTN turns agent history into context:
- it prefers edit episodes over whole-session summaries
- one long session can become multiple observations if the work clearly split across multiple implementation chunks
- each observation tries to preserve:
- which agent produced it (
codexorclaude) - which workspace / cwd it happened in
- which files or targets were touched when they can be inferred
- a short anchor summary based on the triggering user request
- which agent produced it (
Default agent-session collection window:
- look back: last 168 hours
- max retained observations per collection pass: 16
- max observations per session: 3
- Codex subagent sessions: excluded by default
- non-edit sessions: included as compact summaries when no concrete edit episode is found
Important limitation:
- GTN's current agent-session ingest is intentionally lossy
- it stores compact episode summaries, not full transcript replay inside memory
3. Where this context goes
The default context skill writes normalized observations into:
context/naive-context/outbox.md
Those observations are then ingested into the active memory layer, where they can influence:
- which adjacent topics GTN searches outward for
- which findings seem more relevant right now
- how the final briefing is prioritized
4. What GTN does not currently scan by default
In the current default stack, GTN is not trying to broadly sweep your machine for arbitrary personal data. For example, this repo's default context skill does not currently ingest:
- chat logs
- arbitrary local documents
- clipboard history
- terminal scrollback in general
- full browser page contents
That may evolve later, but the current default implementation is much narrower: recent browser history plus recent coding-agent work history.
Configuration
Notion Output
The Notion output skill is configured in:
~/.gtn/runtime/GoodToKnow/output/notion-briefing/settings.json
The main fields are:
parent_page_urldatabase_urlvisible_propertiesdefault_status
Typical flow:
- Create an empty page in Notion
- Give that page URL to the installer
- Let GoodToKnow create or manage the recommendation database under that page
User Profile
During install, GTN can ask for a short self-description.
This should include things like:
- interests
- the main work you do on this machine
- recurring topics you care about
That description is written into local memory and used as a recommendation hint.
Scheduler Cadence
Current supported cadence values are:
15m30m1h6h12h1d
Example:
gtn freq 1h
Current Scope
This project is still experimental.
What exists now:
- a local GTN CLI shell
- a Codex-driven runtime loop
- local context and memory
- recommendation scoring
- Notion publishing
- feedback capture from Notion
What is still evolving:
- recommendation quality
- memory retrieval
- unattended run reliability
- installer polish
- broader output surfaces
Repository Layout
The repository is organized around swappable skill folders:
bootstrap/
context/
memory/
discovery/
runtime/
output/
Each skill owns:
- its own
SKILL.md - scripts
- local config
- local data shape
The bootstrap layer only selects the active stack. Internal behavior stays inside the chosen skills.
Notes
- GoodToKnow is currently macOS-first.
- The current local product shell assumes Codex is already installed and authenticated.
Project details
Release history Release notifications | RSS feed
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 goodtoknow_gtn-0.2.1.tar.gz.
File metadata
- Download URL: goodtoknow_gtn-0.2.1.tar.gz
- Upload date:
- Size: 161.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ce84c3999aa5234b8fd0e5bac87f79beb72821a3c2b902d80bfd8dd07f21e229
|
|
| MD5 |
932d0f7c49424a8f6c2a5caa1b698c55
|
|
| BLAKE2b-256 |
ebeca741a94571afbeb6e102d8ffc766021ad7d55bc17dbe5b015a92ce6dd72a
|
File details
Details for the file goodtoknow_gtn-0.2.1-py3-none-any.whl.
File metadata
- Download URL: goodtoknow_gtn-0.2.1-py3-none-any.whl
- Upload date:
- Size: 212.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb9091b6a37287b5a375bc37c19b74cec2b85fea7ac566deff539f12acaed4f9
|
|
| MD5 |
288fd94270410de8a791a27a394e85a2
|
|
| BLAKE2b-256 |
af9a2f699ab28fe8d824e871250db53a8e49d1509bb8f6b2f17a9ac2495abf1b
|