{"id":50775923,"url":"https://github.com/excelano/blick-cli","last_synced_at":"2026-06-12T00:00:17.060Z","repository":{"id":360208148,"uuid":"1237157693","full_name":"excelano/blick-cli","owner":"excelano","description":"Command-line check-in for Microsoft 365: unread Outlook mail, Teams chats, and next meeting from one Go binary.","archived":false,"fork":false,"pushed_at":"2026-06-11T22:07:11.000Z","size":128,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-11T22:20:25.111Z","etag":null,"topics":["calendar","cli","command-line-tool","go","golang","microsoft-365","microsoft-graph","outlook","productivity","teams"],"latest_commit_sha":null,"homepage":"https://excelano.com/checkin-cli/","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/excelano.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":"SECURITY.md","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-05-12T23:46:21.000Z","updated_at":"2026-06-11T22:07:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/excelano/blick-cli","commit_stats":null,"previous_names":["excelano/checkin-cli","excelano/blick-cli"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/excelano/blick-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/excelano%2Fblick-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/excelano%2Fblick-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/excelano%2Fblick-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/excelano%2Fblick-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/excelano","download_url":"https://codeload.github.com/excelano/blick-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/excelano%2Fblick-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34222709,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","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":["calendar","cli","command-line-tool","go","golang","microsoft-365","microsoft-graph","outlook","productivity","teams"],"created_at":"2026-06-12T00:00:16.106Z","updated_at":"2026-06-12T00:00:17.047Z","avatar_url":"https://github.com/excelano.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# blick\n\nCheck unread Outlook emails, Teams chats, and your next meeting from the terminal.\n\n## Install\n\nThe fastest path on Linux or macOS:\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/excelano/blick-cli/main/install.sh | sh\n```\n\nThis downloads the latest release binary for your platform, verifies the SHA-256 checksum, and installs it to `/usr/local/bin` (or `~/.local/bin` if `/usr/local/bin` isn't writable). Override the destination with `BLICK_INSTALL_DIR=$HOME/bin sh`; pin to a specific tag with `BLICK_VERSION=v0.4.0 sh`.\n\nOn Debian and Ubuntu, add the [Excelano apt repository](https://excelano.com/apt/) once so updates flow through `apt upgrade`:\n\n```sh\ncurl -fsSL https://excelano.com/apt/setup.sh | sudo sh\nsudo apt install blick\n```\n\nTo uninstall: `curl -fsSL https://raw.githubusercontent.com/excelano/blick-cli/main/uninstall.sh | sh` (or `sudo apt remove blick` if installed via apt).\n\n### Build from source\n\n```bash\ngit clone https://github.com/excelano/blick-cli\ncd blick-cli\ngo build -o blick .\nmv blick ~/bin/\n```\n\nRequires Go 1.25+.\n\n## Setup\n\nYou'll need an Azure app registration before `blick` can authenticate. Both options below assume you've already installed the binary.\n\n### Option A: Automated (requires Azure CLI)\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/excelano/blick-cli/main/setup.sh -o setup.sh\nchmod +x setup.sh\naz login\n./setup.sh\n```\n\n(Or if you installed via apt, `setup.sh` ships at `/usr/share/doc/blick/setup.sh`.)\n\n### Option B: Manual (Azure portal)\n\n1. Go to [Azure Portal](https://portal.azure.com) → Azure Active Directory → App registrations\n2. **New registration**\n   - Name: `blick`\n   - Supported account types: Accounts in this organizational directory only\n3. **Authentication** → Add a platform → Mobile and desktop applications\n   - Check `https://login.microsoftonline.com/common/oauth2/nativeclient`\n   - Enable **Allow public client flows** (required for device code flow)\n   - Save\n4. **API permissions** → Add a permission → Microsoft Graph → Delegated permissions:\n   - `User.Read`\n   - `Mail.ReadWrite`\n   - `Mail.Send`\n   - `Calendars.Read`\n   - `Presence.ReadWrite`\n   - `People.Read`\n   - `Chat.ReadWrite` (optional, Teams chat support)\n   - `Chat.Create` (optional, Teams chat support)\n5. Copy **Application (client) ID** and **Directory (tenant) ID** from the Overview page\n\nCreate the config file:\n\n```bash\nmkdir -p ~/.config/blick\ncat \u003e ~/.config/blick/config.json \u003c\u003c 'EOF'\n{\n    \"client_id\": \"YOUR_CLIENT_ID_HERE\",\n    \"tenant_id\": \"YOUR_TENANT_ID_HERE\",\n    \"enable_teams\": true,\n    \"presence_heartbeat\": true\n}\nEOF\n```\n\n### Admin Consent\n\nBy default, none of these Graph permissions require admin consent — they are all user-consentable, including the Chat scopes. Some tenants tighten the default and require admin consent for one or more of these; if yours does, ask your IT admin to grant consent:\n\n```bash\naz ad app permission admin-consent --id YOUR_CLIENT_ID\n```\n\nIf a specific scope is blocked, the corresponding feature degrades: set `\"enable_teams\": false` to skip Teams chat, `\"presence_heartbeat\": false` to skip the presence nudge. The address book seed (`blick contacts seed`) needs `People.Read`; if that's blocked, hand-edit `~/.config/blick/contacts.json` instead.\n\n## Usage\n\n```\n$ blick\n\n  📅 Standup with Tony — in 47 min · 10:30 AM — Online\n\n  📧 unread emails (3):\n    1. Alex K. — \"Deck revisions\"              (10 min ago · 9:42 AM)\n    2. Jordan R. — \"RE: Contract draft\"         (1 hour ago · 8:53 AM)\n    3. Newsletter — \"Weekly digest\"             (3 hours ago · 6:48 AM)\n\n  💬 unread chats (2):\n    4. Sam P. — \"quick question on timeline\"    (32 min ago · 9:20 AM)\n    5. Riley T. — \"can you check the numbers\"   (1 hour ago · 8:51 AM)\n\n  Commands:\n    \u003cN\u003e      view               r\u003cN\u003e     reply\n    d\u003cN\u003e     done               r        refresh\n    t        show today         x        exit (mark all read)\n    H        help               q        quit\n\nblick\u003e 1\n  (shows full email body)\n\nblick\u003e r4\n  Reply in Sam P.:\n  (end with `.` on a line by itself, or Ctrl-C to cancel)\n  \u003e Should be ready by EOD tomorrow.\n  \u003e Let me know if you want to walk through it on a call.\n  \u003e .\n  Sent.\n\nblick\u003e d3\n  Marked as read: Weekly digest\n\nblick\u003e x\n  All marked as read.\n```\n\nEach short command has a full-word equivalent — `reply 4`, `done 3`, `refresh`, `exit`, `quit`, `help`, `today`. Type `H` (or `help`) at the prompt for the full reference.\n\n`t` (or `today`) shows the full calendar for the day, with past events dimmed and the current event highlighted:\n\n```\n$ blick today\n\n  Tuesday, June 9, 2026\n\n      9:00 AM – 9:30 AM    Daily standup            Online\n     10:30 AM – 11:00 AM   Tony 1:1                 Online\n      1:00 PM – 2:00 PM    Project review · now     Online\n      4:00 PM – 5:00 PM    Demo prep                Conf Room A\n\n  4 events · 4h scheduled\n```\n\nThe same view is available inside the REPL by typing `today`.\n\n## Files\n\n- `~/.config/blick/config.json` — client ID, tenant ID, and feature flags\n- `~/.config/blick/token.json` — cached OAuth token (auto-created)\n\n## Permissions\n\nAll scopes are user-consentable by default per Microsoft's stock Graph policy. Individual tenants can require admin consent for any of them — see the [Admin Consent](#admin-consent) section.\n\n| Permission | What it does |\n|---|---|\n| User.Read | Verify authentication |\n| Mail.ReadWrite | Read and mark-read emails |\n| Mail.Send | Reply to emails |\n| Calendars.Read | Show next meeting and today's calendar |\n| Presence.ReadWrite | Nudge presence Away → Available on run |\n| People.Read | Seed the address book from frequently-contacted people |\n| Chat.ReadWrite | Read/reply Teams chats |\n| Chat.Create | Start new 1:1 chats with address-book contacts |\n\n## Presence heartbeat\n\nWhen you run `blick`, the tool reads your current Microsoft 365 presence. If\nyou're showing as Away — typically because Teams' idle timer fired — blick\nregisters itself as an active session with availability `Available` for one\nhour. Subsequent runs reset the hour.\n\nThe mechanic is Graph's `presence: setPresence` endpoint, which is a\n*session* (not an override). Microsoft aggregates across sessions with the\nprecedence DoNotDisturb \u003e Busy \u003e Available \u003e Away, so our Available wins\nover Teams' idle-driven Away, but a user-set Do Not Disturb still wins over\nour Available. We never touch Busy, In a meeting, or Out of office — those\nare real signals and stay as-is.\n\nOpt out with `\"presence_heartbeat\": false` in config. With the heartbeat\noff, the `Presence.ReadWrite` scope is also not requested.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexcelano%2Fblick-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexcelano%2Fblick-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexcelano%2Fblick-cli/lists"}