{"id":48924272,"url":"https://github.com/conner2077/polars-daily-log","last_synced_at":"2026-04-22T09:01:00.121Z","repository":{"id":351524549,"uuid":"1211360004","full_name":"Conner2077/polars-daily-log","owner":"Conner2077","description":"Your personal work-activity aggregator — tracks foreground activity + Git commits across all your machines, LLM-summarizes the day, and pushes to Jira / WeChat Work / Feishu / Slack. Runs 100% locally.","archived":false,"fork":false,"pushed_at":"2026-04-20T14:06:16.000Z","size":4549,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-21T08:03:02.628Z","etag":null,"topics":["activity-monitor","fastapi","jira","linux","llm","local-first","macos","ocr","productivity","python","sqlite","time-tracking","vue","windows","worklog"],"latest_commit_sha":null,"homepage":"https://conner2077.github.io/polars-daily-log/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Conner2077.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-15T10:09:54.000Z","updated_at":"2026-04-20T14:06:37.000Z","dependencies_parsed_at":"2026-04-21T08:01:22.601Z","dependency_job_id":null,"html_url":"https://github.com/Conner2077/polars-daily-log","commit_stats":null,"previous_names":["conner2077/polars-daily-log"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/Conner2077/polars-daily-log","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Conner2077%2Fpolars-daily-log","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Conner2077%2Fpolars-daily-log/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Conner2077%2Fpolars-daily-log/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Conner2077%2Fpolars-daily-log/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Conner2077","download_url":"https://codeload.github.com/Conner2077/polars-daily-log/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Conner2077%2Fpolars-daily-log/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32128704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T08:34:57.708Z","status":"ssl_error","status_checked_at":"2026-04-22T08:34:55.583Z","response_time":58,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["activity-monitor","fastapi","jira","linux","llm","local-first","macos","ocr","productivity","python","sqlite","time-tracking","vue","windows","worklog"],"created_at":"2026-04-17T06:06:35.742Z","updated_at":"2026-04-22T09:01:00.055Z","avatar_url":"https://github.com/Conner2077.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg alt=\"Polars Daily Log\" src=\"docs/banner.svg\" width=\"100%\"/\u003e\n\n### Your day, automatically — from activity to worklog.\n\nA personal, local-first work-activity aggregator. It silently tracks foreground activity and Git commits across all your machines, asks an LLM to summarize the day, and pushes the result to Jira / WeChat Work / Feishu / Slack with one click.\n\n[中文](README_zh.md) / English\n\n\u003ca href=\"https://github.com/Conner2077/polars-daily-log/issues\"\u003eReport Issues\u003c/a\u003e · \u003ca href=\"https://github.com/Conner2077/polars-daily-log/issues/new?labels=feedback\"\u003eFeedback\u003c/a\u003e · \u003ca href=\"CHANGELOG.md\"\u003eChangelog\u003c/a\u003e · \u003ca href=\"docs/release.md\"\u003eRelease Guide\u003c/a\u003e\n\n[![Release][release-shield]][release-link]\n[![Stars][stars-shield]][stars-link]\n[![Issues][issues-shield]][issues-link]\n[![License][license-shield]][license-link]\n[![Last commit][last-commit-shield]][last-commit-link]  \n[![Python][python-shield]][python-link]\n[![Platform][platform-shield]][platform-link]\n[![Downloads][downloads-shield]][downloads-link]\n\n🔒 **100% local** — one install per person, your data never leaves your own machines.\n\n\u003c/div\u003e\n\n## Features\n\n\u003cimg src=\"docs/screenshots/dashboard.png\" width=\"800\" alt=\"Dashboard\"/\u003e\n\n| Page | What it does |\n|------|-------------|\n| **Dashboard** | Today's work hours, activity count, timeline, pending logs |\n| **Activities** | Browse all captured foreground windows, URLs, LLM summaries, screenshots |\n| **MyLog** | View / edit / push daily, weekly, monthly, quarterly summaries |\n| **Chat** | AI Q\u0026A — ask about your week, draft timesheets, export conversations |\n| **Issues** | Manage active Jira Issues for per-issue worklog splitting |\n| **Settings** | LLM engines, Git repos, Jira, Prompts, scopes \u0026 outputs, privacy, auto-update |\n\nFor detailed usage with screenshots, see the [Usage Guide](docs/usage-guide.md).\n\n---\n\n## How many machines do you use?\n\n| Your situation | How to install |\n|---|---|\n| **Just one computer** (most common) | Install `both` on that one machine — server + collector in one |\n| **Multiple machines to aggregate** (MacBook + work desktop + Linux box etc.) | Install `both` on the machine that's always on as the hub; install `collector` only on the others and point them at the hub |\n| **I want to hack on the code** | [Jump to §Developers](#developers) |\n\n---\n\n## Quick Start\n\n### Prerequisites\n\n| | macOS | Linux | Windows |\n|---|-------|-------|---------|\n| Python 3.9+ | built-in | built-in | `winget install Python.Python.3.12` |\n| git | `xcode-select --install` | `apt install git` | `winget install Git.Git` |\n\n### Install\n\n#### One-liner (recommended, macOS / Linux)\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Conner2077/polars-daily-log/master/bootstrap.sh | bash\n```\n\nThis pulls the latest release, extracts it to `~/.polars-daily-log`, and runs `install.sh` interactively.\n\nNon-interactive variant (e.g. installing a collector on a second machine):\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Conner2077/polars-daily-log/master/bootstrap.sh | \\\n  PDL_ROLE=collector \\\n  PDL_SERVER_URL=http://your-hub-ip:8888 \\\n  PDL_COLLECTOR_NAME=my-laptop \\\n  bash\n```\n\nOptional env vars: `PDL_VERSION` (pin a version, default `latest`), `PDL_INSTALL_DIR` (default `~/.polars-daily-log`).\n\n#### Manual install (Windows, or offline handoff)\n\n1. **Download the tarball** from the [Releases page](https://github.com/Conner2077/polars-daily-log/releases)\n2. **Extract**\n\n   ```bash\n   tar xzf polars-daily-log-0.2.0.tar.gz\n   cd polars-daily-log-0.2.0\n   ```\n\n3. **Run the installer**\n\n   ```bash\n   # macOS / Linux\n   bash install.sh\n\n   # Windows (PowerShell)\n   powershell -ExecutionPolicy Bypass -File install.ps1\n   ```\n\n4. **Follow the prompts**\n\n   **Scenario A — only using this one machine**:\n\n   ```\n   0. What are you installing?\n     1) server      — ...\n     2) collector   — ...\n     3) both        — ...\n     Choose: 3          \u003c- pick both\n   ```\n\n   **Scenario B — this is an additional machine, just push data to your hub**:\n\n   ```\n     Choose: 2          \u003c- pick collector\n     Server URL: http://your-hub-ip:8888\n     Collector name [this-host]: \u003c- press Enter for default\n   ```\n\n5. **Start it**\n\n   ```bash\n   ./pdl server start            # scenario A or the hub\n   ./pdl collector start         # scenario B\n   ```\n\n6. **Open `http://127.0.0.1:8888`** (or the hub machine's IP). In Settings, configure:\n   - **LLM**: choose Kimi / OpenAI / Claude, paste your API key (or leave blank to use the built-in Kimi default)\n   - **Jira** (optional): if you want daily logs to sync as Jira worklogs, scan the QR to sign into Jira SSO\n\n---\n\n## Daily use\n\n### Start / stop\n\n| What | Command |\n|---|---|\n| Start everything | `./pdl start` (server + collector together) |\n| Start server only | `./pdl server start` |\n| Start collector only | `./pdl collector start` |\n| Status | `./pdl status` |\n| Stop | `./pdl stop` |\n| Restart | `./pdl restart` |\n\n### Logs / debug\n\n```bash\n./pdl server logs 100         # server backend log\n./pdl server logs -f          # follow live\n./pdl collector logs 50       # collector log\n```\n\n### Windows equivalents\n\nOn Windows, autostart goes through Scheduled Tasks (the installer asks whether to enable login autostart):\n\n```powershell\nStart-ScheduledTask -TaskName AutoDailyLogServer\nStop-ScheduledTask -TaskName AutoDailyLogServer\nGet-ScheduledTaskInfo -TaskName AutoDailyLogCollector\n```\n\n### Where your data lives\n\n| Thing | Path |\n|---|---|\n| Database (activities, logs, config) | `~/.auto_daily_log/data.db` |\n| Screenshots | `~/.auto_daily_log/screenshots/YYYY-MM-DD/` |\n| Server log | `~/.auto_daily_log/logs/server.log` |\n| Collector log | `~/.auto_daily_log_collector/logs/collector.log` (standalone collector) |\n| Config files | `\u003cinstall-dir\u003e/config.yaml`, `\u003cinstall-dir\u003e/collector.yaml` |\n\nWhen you overwrite the tarball to upgrade, nothing under `~/` is touched — upgrades don't lose data.\n\n---\n\n## Core features\n\n### Summary scopes\n\nThe system supports four calendar-aligned summary scopes, each with configurable trigger times:\n\n| Scope | Description | Default trigger |\n|-------|-------------|-----------------|\n| Daily (day) | Summarize by natural day | 22:33 |\n| Weekly (week) | Summarize by natural week (Mon–Sun) | Sunday |\n| Monthly (month) | Summarize by natural month | End of month |\n| Quarterly (quarter) | Summarize by natural quarter | End of quarter |\n\nManage scopes in **Settings \u003e Scopes \u0026 Outputs**. Each scope can have multiple outputs, each with its own LLM engine, Prompt template, and publisher config.\n\n### Multi-engine LLM\n\nConfigure multiple LLM engines (Kimi / OpenAI / Claude / custom endpoint) simultaneously — different outputs can use different engines. Manage in **Settings \u003e LLM Engines**.\n\n### Git repo collection\n\nAdd local git repo paths and author email in **Settings \u003e Git Repos**. The system automatically collects today's commits (message, insertions/deletions, file list) when generating logs, feeding them to the LLM alongside foreground activities for more accurate summaries.\n\n### Push to messaging platforms (Webhook)\n\nBesides Jira, you can push daily logs to group chats via webhook — WeChat Work, Feishu, Slack, or any HTTP endpoint.\n\n1. **Get the webhook URL** from your group chat bot settings\n2. **Open Settings** \u003e \"Scopes \u0026 Outputs\" \u003e add or edit an output\n3. Set **Push Platform** to \"Webhook\", paste the URL, pick **Message Format** (WeChat Work / Feishu / Slack / Generic JSON)\n4. Set **Push Mode** to \"Manual\" or \"Auto-push after scheduled generation\"\n\n| Format | Body sent |\n|---|---|\n| WeChat Work | `{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"...\"}}` |\n| Feishu | `{\"msg_type\":\"text\",\"content\":{\"text\":\"...\"}}` |\n| Slack | `{\"text\":\"...\"}` |\n| Generic JSON | `{\"issue_key\":\"...\",\"time_spent_sec\":...,\"comment\":\"...\",\"started\":\"...\"}` |\n\n\u003e **Manual vs auto**: \"Auto-push after scheduled generation\" only triggers when the scheduler generates logs on its cron schedule. Manually clicking \"Generate\" in the UI will **not** auto-push — use the push button on the generated summary instead.\n\n### Chat — AI Q\u0026A\n\nAI-powered conversation based on the last 7 days of work logs and activities. You can:\n- Ask \"what did I do this week?\"\n- Ask it to \"draft a timesheet for me\"\n- Export conversation history\n\n### Privacy\n\n- All data is stored 100% locally — nothing is uploaded to any server\n- Configure `blocked_apps` / `blocked_urls` in `config.yaml` to exclude specific apps or URLs\n- Sensitive apps like WeChat Work are skipped for deep introspection via `hostile_apps_applescript` config\n- Deleted data goes to the recycle bin; permanently clean up in **Settings \u003e Recycle Bin**\n\n### Feedback\n\nClick **\"Feedback\"** in the left sidebar — pick a type (Bug / Suggestion / Other), write a few words and submit. The current page URL and browser UA are attached automatically.\n\n---\n\n## Upgrade\n\n**Installed via the one-liner**: rerun the same curl command. It upgrades in place (runs `./pdl stop` first; your data under `~/` is untouched).\n\n**Installed manually**:\n```bash\n# Stop services\n./pdl stop\n\n# Overwrite the install dir with the new tarball (venv is kept, data under ~/ is kept)\ntar xzf polars-daily-log-0.2.0.tar.gz --strip-components=1\n\n# Reinstall Python from the new wheel; the frontend dist ships inside the wheel\n./pdl build --restart\n```\n\nYou can also enable auto-update detection in **Settings \u003e Auto Update**.\n\nIf a release requires config migration, it'll be called out at the top of `CHANGELOG.md`.\n\n---\n\n## Uninstall\n\n```bash\n./pdl stop\ncd ..\nrm -rf ~/.polars-daily-log            # or your manual install dir\nrm -rf ~/.auto_daily_log              # data + logs (skip if you want to keep them)\nrm -rf ~/.auto_daily_log_collector    # standalone collector credentials + offline queue\n```\n\nWindows extras:\n```powershell\nUnregister-ScheduledTask -TaskName AutoDailyLogServer -Confirm:$false\nUnregister-ScheduledTask -TaskName AutoDailyLogCollector -Confirm:$false\n```\n\n---\n\n## Troubleshooting\n\n| Symptom | What to check |\n|---|---|\n| `No module named aiosqlite` on startup | venv not activated / `install.sh` was skipped. Rerun `bash install.sh` |\n| Daily summary contains only `Activity summary: ...` lines | LLM call failed → in Web UI Settings, verify engine / URL / API key match |\n| Submitting to Jira returns 500 \"Internal Server Error\" | The comment contained an emoji. The latest version scrubs these automatically — upgrade |\n| WeCom auto-exits after 2-4 minutes | Make sure `monitor.hostile_apps_applescript` in `config.yaml` includes `wechat/wecom/企业微信` |\n| Webhook push shows success but group didn't receive | Check that `format` in publisher_config matches the platform (`wecom` for WeChat Work, `feishu` for Feishu) |\n| Frontend blank page | `./pdl server logs 50` to check the backend; hard-reload the browser (Cmd/Ctrl+Shift+R) |\n| Windows collector is idle | Check `%USERPROFILE%\\.auto_daily_log_collector\\logs\\collector.log` and the Scheduled Task status |\n\n---\n\n## Developers\n\nIf you cloned the repo instead of unpacking a tarball:\n\n### Prerequisites\n- Python 3.9+, Node.js 18+, git\n\n### Getting started\n\n```bash\ngit clone https://github.com/Conner2077/polars-daily-log.git\ncd polars-daily-log\nbash install.sh              # auto-detects no wheel -\u003e dev mode (pip install -e . + frontend source build)\n./pdl server start\n```\n\n### Day-to-day\n\n| What | Command |\n|---|---|\n| Rebuild after pull | `./pdl build --restart` |\n| Frontend only | `./pdl build --no-python` |\n| Run tests | `.venv/bin/python -m pytest tests/ -q` |\n| Frontend hot-reload dev | `cd web/frontend \u0026\u0026 npm run dev`, open `localhost:5173` |\n\n### Cutting a release\n\nSee [`docs/release.md`](docs/release.md).\n\n### Project principles\n\nSee [AGENTS.md](AGENTS.md) (Claude Code loads it via `CLAUDE.md -\u003e @AGENTS.md`). The core rules:\n\n- **Keep the raw record**: daily summaries don't filter; downstream consumers (Jira submission uses `AUTO_APPROVE_PROMPT`) do the filtering\n- **Two-layer platform code**: raw OS APIs live in `auto_daily_log/monitor/`; adapters live in `auto_daily_log_collector/platforms/`\n- **Single Jira entry point**: `jira_client.client.build_jira_client_from_db`, which handles emoji / 4-byte UTF-8 scrubbing for you\n\n---\n\n## License\n\nApache 2.0. See [LICENSE](LICENSE).\n\n\u003c!-- Badge references --\u003e\n[release-shield]: https://img.shields.io/github/v/release/Conner2077/polars-daily-log?style=flat-square\u0026color=brightgreen\u0026label=release\n[release-link]: https://github.com/Conner2077/polars-daily-log/releases\n[stars-shield]: https://img.shields.io/github/stars/Conner2077/polars-daily-log?style=flat-square\u0026color=yellow\n[stars-link]: https://github.com/Conner2077/polars-daily-log/stargazers\n[issues-shield]: https://img.shields.io/github/issues/Conner2077/polars-daily-log?style=flat-square\u0026color=orange\n[issues-link]: https://github.com/Conner2077/polars-daily-log/issues\n[license-shield]: https://img.shields.io/github/license/Conner2077/polars-daily-log?style=flat-square\u0026color=blue\n[license-link]: https://github.com/Conner2077/polars-daily-log/blob/master/LICENSE\n[last-commit-shield]: https://img.shields.io/github/last-commit/Conner2077/polars-daily-log?style=flat-square\n[last-commit-link]: https://github.com/Conner2077/polars-daily-log/commits/master\n[python-shield]: https://img.shields.io/badge/python-3.9%2B-blue?style=flat-square\u0026logo=python\u0026logoColor=white\n[python-link]: https://www.python.org/downloads/\n[platform-shield]: https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey?style=flat-square\n[platform-link]: #prerequisites\n[downloads-shield]: https://img.shields.io/github/downloads/Conner2077/polars-daily-log/total?style=flat-square\u0026color=success\n[downloads-link]: https://github.com/Conner2077/polars-daily-log/releases\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconner2077%2Fpolars-daily-log","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconner2077%2Fpolars-daily-log","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconner2077%2Fpolars-daily-log/lists"}