{"id":30000129,"url":"https://github.com/edgarbc/arrowhead","last_synced_at":"2025-08-05T05:07:30.986Z","repository":{"id":300791357,"uuid":"1004685821","full_name":"edgarbc/arrowhead","owner":"edgarbc","description":"Obsidian automated summarizer.  Automate weekly retrospectives summarizing journal entries tagged with specific hashtags.","archived":false,"fork":false,"pushed_at":"2025-08-01T13:22:38.000Z","size":101,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-01T15:32:13.603Z","etag":null,"topics":["llm-application","obsidian","ollama-app"],"latest_commit_sha":null,"homepage":"","language":"Python","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/edgarbc.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}},"created_at":"2025-06-19T02:58:47.000Z","updated_at":"2025-08-01T13:22:42.000Z","dependencies_parsed_at":"2025-07-24T15:16:18.598Z","dependency_job_id":"56b5896c-bb91-4c25-acd5-5323424f5848","html_url":"https://github.com/edgarbc/arrowhead","commit_stats":null,"previous_names":["edgarbc/arrowhead"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/edgarbc/arrowhead","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edgarbc%2Farrowhead","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edgarbc%2Farrowhead/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edgarbc%2Farrowhead/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edgarbc%2Farrowhead/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/edgarbc","download_url":"https://codeload.github.com/edgarbc/arrowhead/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edgarbc%2Farrowhead/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268837794,"owners_count":24314982,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-05T02:00:12.334Z","response_time":2576,"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":["llm-application","obsidian","ollama-app"],"created_at":"2025-08-05T05:02:31.118Z","updated_at":"2025-08-05T05:07:30.978Z","avatar_url":"https://github.com/edgarbc.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Arrowhead 🏹\n\n[![Python](https://img.shields.io/badge/Python-3.8+-blue.svg)](https://python.org)\n[![UV](https://img.shields.io/badge/UV-Fast%20Python%20Package%20Manager-orange.svg)](https://docs.astral.sh/uv/)\n[![Ollama](https://img.shields.io/badge/Ollama-Local%20LLMs-green.svg)](https://ollama.ai)\n[![DSPy](https://img.shields.io/badge/DSPy-Declarative%20LLM%20Programming-purple.svg)](https://github.com/stanfordnlp/dspy-ai)\n[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Tests](https://img.shields.io/badge/Tests-Passing-brightgreen.svg)](https://github.com/yourusername/arrowhead/actions)\n\n\u003e **Obsidian Weekly Hashtag Summarizer** - Automate weekly retrospectives by summarizing journal entries tagged with specific hashtags using local LLMs.\n\n## 🎯 Overview\n\nArrowhead is a CLI tool that automates the repetitive task of creating weekly summaries from your Obsidian vault. It scans your journal entries, filters by hashtags and date ranges, and generates consolidated summaries using local LLMs via Ollama.\n\n### ✨ Features\n\n- **🔍 Smart Vault Scanning** - Discovers markdown files while excluding Obsidian-specific directories\n- **��️ Hashtag Filtering** - Filter entries by specific hashtags (e.g., `#meeting`, `#work`)\n- **📅 Date Range Support** - Focus on specific weeks or date ranges\n- **🤖 Local LLM Integration** - Uses Ollama for cost-effective, privacy-focused summarization\n- **📦 Intelligent Batching** - Groups entries efficiently to respect token limits\n- **📝 Structured Output** - Generates well-formatted summaries with metadata\n- **💻 Chat with your notes** - Chat with your summaries using retrieval-augmented generation.\n- **⚡ Fast \u0026 Lightweight** - Built with UV for rapid development and deployment\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n- **Python 3.8+**\n- **UV** (Fast Python package manager)\n- **Ollama** (Local LLM runtime)\n\n### Installation\n\n```bash\n# Clone the repository\ngit clone https://github.com/yourusername/arrowhead.git\ncd arrowhead\n\n# Install dependencies with UV\nuv sync\n\n# Install in development mode\nuv pip install -e .\n```\n\n### Testing\nThe project both unit tests and integration tests. Integration tests require a local Ollama instance running.\n\n```bash\n# Run all unit tests (no external dependencies)\nuv run pytest tests/ -v\n\n# Run only unit tests (excludes integration tests)\nuv run pytest tests/ -v -m \"not integration\"\n\n# Run integration tests (requires Ollama)\nuv run pytest tests/ -v --run-integration\n\n# Run all tests including integration tests\nuv run pytest tests/ -v --run-integration\n\n# Run a specific test file\nuv run pytest tests/test_scanner.py -v\n\n# Run integration tests with specific model\nuv run pytest tests/test_summarizer_integration.py -v --run-integration\n```\n\n\n### Basic Usage\n\n```bash\n# Generate a weekly summary for #meeting entries\narrowhead summarize /path/to/obsidian/vault --hashtag meeting\n\n# Specify a custom date range\narrowhead summarize /path/to/vault --hashtag work \\\n  --week-start 2024-01-15 --week-end 2024-01-21\n\n# Use a different LLM model\narrowhead summarize /path/to/vault --hashtag project \\\n  --model llama2:7b\n\n# Chat with your summaries using RAG\narrowhead chat --summaries Summaries/\n\n# Scan vault to see what would be processed\narrowhead scan /path/to/vault --hashtag meeting\n\n```\n\n\n\n\n## 📦 Project Structure\n\n```bash\narrowhead/\n├── README.md                # Project overview and setup instructions\n├── pyproject.toml           # Dependency management (or setup.py)\n├── src/\n├── src/\n│   └── arrowhead/\n│       ├── __init__.py      # Package initialization\n│       ├── cli.py           # Entry point and CLI definitions\n│       ├── scanner.py       # Vault scanning and file discovery\n│       ├── parser.py        # Markdown parsing and hashtag filtering\n│       ├── batcher.py       # Entry batching logic\n│       ├── summarizer.py    # LLM prompt construction and API calls\n│       ├── writer.py        # Summary aggregation and note writing\n│       ├── utils.py         # Helper functions (date parsing, logging)\n│       └── rag.py           # RAG system for chatting with summaries\n├── tests/                   # Unit and integration tests\n│   ├── test_scanner.py\n│   ├── test_parser.py\n│   ├── test_batcher.py\n│   ├── test_summarizer.py\n│   └── test_writer.py\n├── examples/                # Sample vault and usage examples\n│   └── journal/\n│       ├── 2024-12-02.md   # Example journal entry markdown file\n│       └── 2024-12-03.md\n├── Summaries/               # Output folder for generated summaries\n├── docs/                    # Additional documentation\n│   └── usage.md             # Usage guide and FAQs\n└── .gitignore               # Ignore venv, __pycache__, etc.\n\n```\n\n---\n\n**Made with ❤️ for the Obsidian community**","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedgarbc%2Farrowhead","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedgarbc%2Farrowhead","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedgarbc%2Farrowhead/lists"}