{"id":47783829,"url":"https://github.com/cassiomarques/memoria","last_synced_at":"2026-04-30T11:01:30.113Z","repository":{"id":349219268,"uuid":"1200368339","full_name":"cassiomarques/memoria","owner":"cassiomarques","description":"A powerful TUI note taking application","archived":false,"fork":false,"pushed_at":"2026-04-20T16:34:41.000Z","size":207405,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-20T18:04:23.896Z","etag":null,"topics":["fuzzy-search","git-sync","mcp","notes","terminal","tui"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cassiomarques.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-03T10:29:29.000Z","updated_at":"2026-04-20T16:34:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"427e7fbb-f593-496f-841f-f435174aedd2","html_url":"https://github.com/cassiomarques/memoria","commit_stats":null,"previous_names":["cassiomarques/memoria"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/cassiomarques/memoria","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cassiomarques%2Fmemoria","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cassiomarques%2Fmemoria/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cassiomarques%2Fmemoria/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cassiomarques%2Fmemoria/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cassiomarques","download_url":"https://codeload.github.com/cassiomarques/memoria/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cassiomarques%2Fmemoria/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32462304,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T22:27:22.272Z","status":"online","status_checked_at":"2026-04-30T02:00:05.929Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fuzzy-search","git-sync","mcp","notes","terminal","tui"],"created_at":"2026-04-03T14:02:46.621Z","updated_at":"2026-04-30T11:01:30.075Z","avatar_url":"https://github.com/cassiomarques.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# memoria\n\n[![CI](https://github.com/cassiomarques/memoria/actions/workflows/ci.yaml/badge.svg)](https://github.com/cassiomarques/memoria/actions/workflows/ci.yaml)\n[![Release](https://github.com/cassiomarques/memoria/actions/workflows/release.yaml/badge.svg)](https://github.com/cassiomarques/memoria/actions/workflows/release.yaml)\n\nA terminal-based note-taking app with full-text search, automatic git sync, editor integration and other niceties. \n\nMemoria keeps your notes as plain Markdown files organized in folders, indexes them for instant search, and automatically syncs everything to a git remote. Edit with your favourite editor, navigate with vim keybindings.\n\n![Memoria - Notes tree with preview](assets/notes-with-preview.jpg)\n\n## Table of Contents\n\n- [Features](#features)\n- [Installation](#installation)\n- [Quick start](#quick-start)\n- [Keybindings](#keybindings)\n- [Commands](#commands) (TUI)\n- [CLI Subcommands](#cli-subcommands)\n  - [Commands Reference](#commands-reference)\n  - [Global Flags](#global-flags)\n  - [How It Works: TUI + CLI Coordination](#how-it-works-tui--cli-coordination)\n  - [External Integration Examples](#external-integration-examples)\n- [MCP Server](#mcp-server)\n- [Configuration](#configuration)\n- [How notes are stored](#how-notes-are-stored)\n- [Architecture](#architecture)\n- [Tech stack](#tech-stack)\n- [Development](#development)\n- [Releasing](#releasing)\n- [License](#license)\n\n## Features\n\n- **Plain Markdown** — Notes are `.md` files with YAML frontmatter. \n- **Full-text search** — Powered by [Bleve](https://blevesearch.com/). Fuzzy, typo-tolerant, instant.\n- **Automatic git sync** — Every create, edit, delete, move, and tag change is committed and pushed.\n- **Folder hierarchy** — Organize notes in nested folders. Collapsible tree view in the TUI.\n- **Tagging** — Add and remove tags at any time. Search and filter by tag.\n- **Your editor** — Opens `$EDITOR` (or vim) for editing. Memoria handles the rest.\n- **Beautiful TUI** — Catppuccin theme (dark/light), markdown preview, vim-style navigation.\n- **CLI subcommands** — `memoria search`, `memoria list`, `memoria tags`, etc. for scripting and AI assistant integration.\n- **Single binary** — Pure Go, no CGO, no external dependencies.\n\n## Installation\n\n### Homebrew (macOS \u0026 Linux)\n\n```bash\nbrew install cassiomarques/tap/memoria\n```\n\n### Go install\n\n```bash\ngo install github.com/cassiomarques/memoria/cmd/memoria@latest\n```\n\n### From source\n\n```bash\ngit clone https://github.com/cassiomarques/memoria.git\ncd memoria\nmake build\n# Binary is in bin/memoria\n```\n\n### GitHub Releases\n\nPre-built binaries for macOS and Linux (amd64 \u0026 arm64) are available on the [Releases](https://github.com/cassiomarques/memoria/releases) page.\n\n## Quick start\n\n```bash\n# Launch the TUI\nmemoria\n\n# On first run, memoria creates:\n#   ~/.memoria/config.yaml    — configuration\n#   ~/.memoria/notes/          — your notes (git repo)\n#   ~/.memoria/meta.db         — metadata (SQLite)\n#   ~/.memoria/search.bleve/   — search index\n```\n\n### Using a custom home directory\n\nUse `--home` to run memoria with a completely isolated data directory:\n\n```bash\n# Great for demos, testing, or separate note collections\nmemoria --home ~/demo-notes\n```\n\nThis creates config, notes, database, and search index all under `~/demo-notes/` instead of `~/.memoria/`.\n\n### Set up git sync (optional but recommended)\n\nCreate a private repository on GitHub (or any git host), then inside memoria:\n\n```\n:remote git@github.com:youruser/my-notes.git\n```\n\nFrom this point on, every change is automatically committed and pushed.\n\n### Create your first note\n\n```\n:new ideas/my-first-note\n```\n\nThis creates `ideas/my-first-note.md` and opens it in your editor. When you save and close, memoria indexes it and syncs to git.\n\n## Keybindings\n\n| Key | Action |\n|-----|--------|\n| **j / k** or **↑ / ↓** | Navigate the note tree |\n| **h / l** or **← / →** | Collapse / expand folder |\n| **Enter** | Open selected note in editor (or toggle folder) |\n| **p** | Toggle markdown preview for selected note |\n| **e** | Edit note from preview (when preview is focused) |\n| **Tab** | Switch focus between tree and preview |\n| **n** | Create a new note in the focused folder |\n| **d** | Trash selected note or folder (permanent delete in trash view) |\n| **:** | Open command bar |\n| **/** | Search / filter notes |\n| **Ctrl+f** | Fuzzy finder (search all notes by name) |\n| **Tab** / **Shift+Tab** | Cycle through finder results |\n| **?** | Show help |\n| **Esc** | Close preview / help / command bar |\n| **q** | Close preview/help if open, otherwise quit |\n| **Ctrl+C** | Quit immediately |\n\n### Search syntax\n\nPress `/` to start searching. Type your query, press **Enter** to lock results and browse them with normal keybindings, press **Esc** to clear.\n\n| Pattern | Meaning |\n|---------|---------|\n| `foo` | Fuzzy match \"foo\" in title, path, folder, tags, and content |\n| `foo bar` | Match \"foo\" **AND** \"bar\" (both must match) |\n| `\"exact phrase\"` | Match exact phrase (substring) |\n| `#tag` | Filter by tag name |\n| `foo #work` | Match \"foo\" AND notes tagged \"work\" |\n\n### Navigation extras\n\n| Key | Action |\n|-----|--------|\n| **g g** | Jump to top of list |\n| **G** | Jump to bottom of list |\n| **Ctrl+d** | Page down |\n| **Ctrl+u** | Page up |\n\n## Commands\n\nType `:` to open the command bar. Tab completion is available for paths, folders, and tags.\n\n| Command | Usage | Description |\n|---------|-------|-------------|\n| `new` | `:new \u003cpath\u003e [tag1 tag2...] [--clipboard]` | Create a note (from clipboard or open editor) |\n| `open` | `:open \u003cpath\u003e` | Open an existing note |\n| `search` | `:search \u003cquery\u003e` | Full-text search across all notes |\n| `tag` | `:tag \u003cpath\u003e \u003ctag1\u003e [tag2...]` | Add tags to a note |\n| `untag` | `:untag \u003cpath\u003e \u003ctag1\u003e [tag2...]` | Remove tags from a note |\n| `ls` | `:ls [folder]` | List notes (optionally in a folder) |\n| `cd` | `:cd [folder]` | Change folder context (`/` for root) |\n| `mv` | `:mv \u003cold\u003e \u003cnew\u003e` | Move or rename a note |\n| `rename` | `:rename \u003cnew-name\u003e` | Rename selected note (stays in same folder) |\n| `rm` | `:rm \u003cpath\u003e` | Trash a note |\n| `tags` | `:tags` | Show all tags with note counts |\n| `todo` | `:todo \u003ctitle\u003e [#tag] [@due(YYYY-MM-DD)] [--folder \u003cpath\u003e] [--clipboard]` | Create a todo note |\n| `todo-due` | `:todo-due \u003cYYYY-MM-DD\u003e` or `:todo-due clear` | Set or clear due date on selected todo |\n| `todos` | `:todos [filter]` | Show todos (filters: overdue, today, pending, done, archived) |\n| `trash` | `:trash` | Open trash view (browse, restore, or permanently delete) |\n| `restore` | `:restore \u003cpath\u003e` | Restore a note from trash |\n| `empty-trash` | `:empty-trash` | Permanently delete all trashed notes |\n| `sync` | `:sync` | Pull from remote and reload all notes |\n| `remote` | `:remote \u003cgit-url\u003e` | Configure git remote |\n| `fixfm` | `:fixfm` | Add frontmatter to notes missing it |\n| `help` | `:help` | Show help |\n| `quit` | `:quit` | Exit memoria |\n\n## CLI Subcommands\n\nMemoria can be used from the command line without opening the TUI. Every command works both when the TUI is running and when it's not.\n\n### Commands Reference\n\n#### `memoria search \u003cquery\u003e [--exact]`\n\nFull-text search across all notes using the Bleve index. Results are ranked by relevance.\n\nMultiple words are AND'd — a note must contain all words to match. Use `--exact` for exact phrase matching (words must appear in that exact order).\n\n```bash\nmemoria search \"meeting notes\"                # Notes containing both \"meeting\" AND \"notes\"\nmemoria search \"database migration\" --json     # JSON output with highlights\nmemoria search --exact \"approved and built\"    # Exact phrase match\n```\n\nOutput includes the note path and relevance score. With `--json`, also includes matched text fragments with `\u003cmark\u003e` highlights.\n\n#### `memoria list [folder]`\n\nList note paths. Without arguments, lists all notes recursively. With a folder name, lists only notes in that folder.\n\n```bash\nmemoria list                    # All notes\nmemoria list Projects           # Notes in Projects/\nmemoria list Projects --json    # As JSON array\n```\n\n#### `memoria tags`\n\nList all tags with note counts.\n\n```bash\nmemoria tags\nmemoria tags --json\n```\n\n#### `memoria todos [filter]`\n\nList todo notes. Optional filter: `overdue`, `today`, `pending`, `done`, `archived`.\n\n```bash\nmemoria todos                   # All todos\nmemoria todos overdue           # Past due and not done\nmemoria todos today             # Due today\nmemoria todos pending           # Not yet done\nmemoria todos done              # Completed\nmemoria todos archived          # Archived todos\nmemoria todos --json            # JSON output\n```\n\n#### `memoria cat \u003cpath\u003e`\n\nPrint a note's markdown content to stdout. The path is relative to your notes directory.\n\n```bash\nmemoria cat daily.md\nmemoria cat Projects/roadmap.md\nmemoria cat Projects/roadmap.md --json   # Content as JSON string\n```\n\n#### `memoria sync`\n\nPull from the git remote, reindex all notes, then commit and push local changes. Equivalent to the TUI's `:sync` command.\n\n```bash\nmemoria sync\n```\n\n#### `memoria new \u003cpath\u003e [--tags tag1,tag2]`\n\nCreate a new note. The path is relative to the notes directory; folders are created automatically. Tags are comma-separated.\n\nContent can be piped via stdin. Without stdin, an empty note (frontmatter only) is created.\n\n```bash\nmemoria new ideas/cool-project.md\nmemoria new logs/deploy.md --tags deploy,ops\n\n# Pipe content from stdin\necho \"# Meeting Notes\" | memoria new meetings/standup.md\n\n# Here-doc\nmemoria new logs/deploy.md --tags ops \u003c\u003cEOF\n# Deploy Log\nDeployed v2.3.1 to production\nEOF\n\n# From a file\ncat draft.md | memoria new final/report.md\n```\n\n#### `memoria edit \u003cpath\u003e`\n\nUpdate the content of an existing note. The new content is read from stdin. Frontmatter metadata (tags, dates) is preserved. Fails if the note does not exist.\n\n```bash\necho \"# Updated Content\" | memoria edit ideas/cool-project.md\n\n# Rewrite a note from a file\ncat revised.md | memoria edit reports/quarterly.md\n\n# Using a here-doc\nmemoria edit logs/deploy.md \u003c\u003cEOF\n# Deploy Log (Updated)\nRolled back v2.3.1 due to errors\nEOF\n```\n\n#### `memoria todo \u003ctitle\u003e [--folder F] [--tags t1,t2] [--due YYYY-MM-DD]`\n\nCreate a new todo note. The title is slugified into a filename (e.g. \"Buy groceries\" → `buy-groceries.md`). Defaults to the `TODO/` folder.\n\n```bash\nmemoria todo \"Buy groceries\"\nmemoria todo \"Review PR\" --folder \"Work/tasks\" --tags review,urgent\nmemoria todo \"Submit report\" --due 2026-04-15\n```\n\n### Global Flags\n\n| Flag | Description |\n|------|-------------|\n| `--json` | Output structured JSON instead of human-readable text |\n| `--home \u003cdir\u003e` | Use a custom config/data directory instead of `~/.memoria` |\n| `--version`, `-v` | Print version and exit |\n| `--help`, `-h` | Print usage and exit |\n\n### How It Works: TUI + CLI Coordination\n\nWhen you run a CLI command while the TUI is open in another terminal, the two coordinate automatically:\n\n1. **The TUI starts a local Unix socket** at `~/.memoria/memoria.sock` on launch\n2. **CLI commands connect to that socket**, sending the request to the running TUI process\n3. **The TUI executes the command** using its already-open services (including the Bleve full-text index)\n4. **After write commands** (`sync`, `new`, `todo`), the TUI automatically refreshes its note list and tags — you'll see the changes appear immediately\n\nWhen no TUI is running, CLI commands open the stores (filesystem, SQLite, Bleve, git) directly. Everything works the same, there's just no live TUI to refresh.\n\nThis design means:\n- **No lock conflicts** — the CLI never fights the TUI for file locks\n- **Full search power** — CLI search uses the same Bleve index as the TUI, not a degraded fallback\n- **Instant feedback** — create a note via CLI and see it appear in the TUI within a second\n\n### External Integration Examples\n\n#### GitHub Copilot CLI / AI Assistants\n\nThe `--json` flag makes output machine-parseable, which is ideal for AI tools operating on your notes:\n\n```bash\n# AI assistant searches your notes\nmemoria search \"authentication flow\" --json | jq '.[].Path'\n\n# AI creates a note with content piped in\nmemoria new \"summaries/meeting-2024-03-15.md\" --tags meeting,summary\n\n# AI checks what's overdue\nmemoria todos overdue --json\n```\n\n#### Shell Scripts and Automation\n\n```bash\n# Daily backup of note list\nmemoria list --json \u003e ~/backups/memoria-notes-$(date +%F).json\n\n# Create a daily journal entry\nmemoria new \"journal/$(date +%Y-%m-%d).md\" --tags journal,daily\n\n# Sync from a cron job (works even without TUI)\nmemoria sync\n\n# Count notes per tag\nmemoria tags --json | jq -r '.[] | \"\\(.Tag): \\(.Count)\"'\n\n# Find all notes about a topic and open them\nmemoria search \"kubernetes\" --json | jq -r '.[].Path' | xargs -I{} memoria cat {}\n```\n\n#### Pipe-Friendly\n\nAll commands write to stdout and errors to stderr, so they compose naturally with Unix pipes:\n\n```bash\n# Search and preview matches\nmemoria search \"TODO\" --json | jq -r '.[].Path' | while read p; do\n  echo \"=== $p ===\"\n  memoria cat \"$p\" | head -5\n  echo\ndone\n```\n\n## MCP Server\n\nMemoria includes a built-in [MCP](https://modelcontextprotocol.io/) (Model Context Protocol) server, allowing AI assistants like GitHub Copilot CLI, VS Code Copilot, Claude Desktop, and other MCP clients to interact with your notes directly.\n\n### Starting the MCP server\n\n```bash\nmemoria mcp\n```\n\nThis starts the MCP server on stdio (stdin/stdout). You don't typically run this manually — it's launched by your MCP client.\n\n### Configuring with GitHub Copilot CLI\n\nAdd to your [MCP configuration](https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/add-mcp-servers):\n\n```json\n{\n  \"mcpServers\": {\n    \"memoria\": {\n      \"command\": \"memoria\",\n      \"args\": [\"mcp\"]\n    }\n  }\n}\n```\n\nTo use a custom notes directory:\n\n```json\n{\n  \"mcpServers\": {\n    \"memoria\": {\n      \"command\": \"memoria\",\n      \"args\": [\"mcp\", \"--home\", \"/path/to/notes\"]\n    }\n  }\n}\n```\n\n### Available tools\n\n| Tool | Description |\n|------|-------------|\n| `search` | Full-text search across all notes with fuzzy matching |\n| `list` | List notes, optionally filtered by folder |\n| `cat` | Read a note's full content |\n| `tags` | List all tags with note counts |\n| `todos` | List todos, optionally filtered (overdue/today/pending/done/archived) |\n| `new` | Create a new note with optional content, tags, or clipboard paste |\n| `edit` | Update the content of an existing note |\n| `todo` | Create a new todo (supports --clipboard) |\n| `sync` | Sync notes with the git remote |\n\n### How it works\n\nThe MCP server delegates each tool call to the `memoria` CLI with `--json` output. This means:\n\n- If the TUI is running, tool calls go through the IPC socket and the TUI refreshes automatically\n- If no TUI is running, stores are opened directly for each call\n- No extra ports, no HTTP — just process-level stdio communication\n\n### Environment variables\n\n| Variable | Description |\n|----------|-------------|\n| `MEMORIA_BIN` | Override the path to the memoria binary used for tool execution |\n\n## Configuration\n\nConfig lives at `~/.memoria/config.yaml`:\n\n```yaml\n# Directory where notes are stored (supports ~ expansion)\nnotes_dir: ~/.memoria/notes\n\n# Git remote URL (set via :remote command)\ngit_remote: \"\"\n\n# Editor command (leave empty to use $EDITOR, $VISUAL, or vim)\neditor: \"\"\n\n# Color theme: \"dark\" (Catppuccin Mocha) or \"light\" (Catppuccin Latte)\ntheme: dark\n\n# Start with all folders expanded (default: true)\nexpand_folders: true\n\n# Show the virtual \"Pinned\" section at the top of the tree (default: true)\nshow_pinned_notes: true\n\n# Show modification timestamps next to notes (default: true, toggle with t)\nshow_timestamps: true\n\n# Default folder for todos created with :todo (default: \"TODO\")\ndefault_todo_folder: \"TODO\"\n\n# Enable/disable todo features (default: true)\ntodos_enabled: true\n```\n\n### Editor resolution\n\nMemoria picks your editor in this order:\n\n1. `editor` field in config.yaml\n2. `$EDITOR` environment variable\n3. `$VISUAL` environment variable\n4. `vim` (fallback)\n\nMulti-word commands work too (e.g., `editor: emacs -nw`).\n\n### Theme\n\nMemoria ships with two themes based on the [Catppuccin](https://github.com/catppuccin/catppuccin) palette:\n\n| Value | Palette | Best for |\n|-------|---------|----------|\n| `dark` (default) | Catppuccin Mocha | Dark terminal backgrounds |\n| `light` | Catppuccin Latte | Light terminal backgrounds |\n\nSet it in `~/.memoria/config.yaml`:\n\n```yaml\ntheme: light\n```\n\nRestart memoria after changing the theme.\n\n## How notes are stored\n\nEach note is a Markdown file with YAML frontmatter:\n\n```markdown\n---\ntags:\n  - go\n  - project\ncreated: 2026-04-01T10:00:00Z\nmodified: 2026-04-02T15:30:00Z\n---\n\n# My Note\n\nContent goes here...\n```\n\n### Todos\n\nTodo notes have extra frontmatter fields:\n\n```markdown\n---\ntags:\n  - work\ntodo: true\ndone: false\ndue: 2026-04-15\ncreated: 2026-04-07T12:00:00Z\nmodified: 2026-04-07T12:00:00Z\n---\n\nDetails about the task...\n```\n\nCreate todos with `:todo fix the auth bug #work @due(2026-04-15)`. Press **x** on a todo to toggle done/undone. Use `:todos` to see all todos sorted by due date. Overdue todos are shown in red, due-today in yellow, done items are dimmed. The status bar shows a count of pending todos and overdue items. Completed todos show a completion date. Press **a** to archive completed todos — archived todos are hidden from the main list and `:todos done`, but accessible via `:todos archived`. Press **a** again on an archived todo to unarchive it.\n\nDeleting a note with **d** or `:rm` moves it to a `.trash/` folder instead of permanently removing it. Use `:trash` to browse trashed notes, **r** to restore one, and `:empty-trash` to permanently delete everything in the trash.\n\nNotes live in `~/.memoria/notes/` and can be nested in folders:\n\n```\n~/.memoria/notes/\n├── work/\n│   ├── meeting-notes.md\n│   └── project-ideas.md\n├── learning/\n│   ├── go/\n│   │   └── concurrency.md\n│   └── rust/\n│       └── ownership.md\n└── daily.md\n```\n\n## Architecture\n\nMemoria uses a three-layer storage design:\n\n| Layer | Location | Purpose |\n|-------|----------|---------|\n| **Filesystem** | `~/.memoria/notes/` | Source of truth — plain Markdown files |\n| **SQLite** | `~/.memoria/meta.db` | Fast metadata lookups, folder listing, tag queries |\n| **Bleve** | `~/.memoria/search.bleve/` | Full-text search index |\n\nAll three stay in sync automatically. The Markdown files are what gets committed to git.\n\n## Tech stack\n\n- [Bubble Tea v2](https://github.com/charmbracelet/bubbletea) — TUI framework\n- [Lip Gloss v2](https://github.com/charmbracelet/lipgloss) — Terminal styling\n- [Glamour v2](https://github.com/charmbracelet/glamour) — Markdown rendering\n- [Bleve v2](https://github.com/blevesearch/bleve) — Full-text search engine\n- [go-git v5](https://github.com/go-git/go-git) — Pure Go git implementation\n- [modernc.org/sqlite](https://pkg.go.dev/modernc.org/sqlite) — Pure Go SQLite\n- [Catppuccin](https://github.com/catppuccin/catppuccin) — Mocha (dark) \u0026 Latte (light) color schemes\n\nEverything is pure Go — no CGO, no system dependencies.\n\n## Development\n\n```bash\n# Run tests (327 tests)\nmake test\n\n# Run with race detector, short mode\nmake test-short\n\n# Coverage report\nmake test-cover\nopen coverage.html\n\n# Lint\nmake lint\n\n# Build\nmake build\n\n# Run directly\nmake run\n```\n\n## Releasing\n\nReleases are automated with [GoReleaser](https://goreleaser.com/) via GitHub Actions:\n\n```bash\ngit tag v0.2.0\ngit push --tags\n```\n\nThis builds binaries for all platforms, creates a GitHub Release, and updates the Homebrew formula.\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcassiomarques%2Fmemoria","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcassiomarques%2Fmemoria","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcassiomarques%2Fmemoria/lists"}