{"id":41955966,"url":"https://github.com/ferueda/birdnotion","last_synced_at":"2026-01-25T22:34:07.134Z","repository":{"id":333599156,"uuid":"1137886074","full_name":"ferueda/birdnotion","owner":"ferueda","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-20T04:02:42.000Z","size":372,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-20T09:27:36.825Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","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/ferueda.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":null,"dco":null,"cla":null}},"created_at":"2026-01-20T01:08:24.000Z","updated_at":"2026-01-20T04:02:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ferueda/birdnotion","commit_stats":null,"previous_names":["ferueda/birdnotion"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ferueda/birdnotion","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ferueda%2Fbirdnotion","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ferueda%2Fbirdnotion/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ferueda%2Fbirdnotion/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ferueda%2Fbirdnotion/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ferueda","download_url":"https://codeload.github.com/ferueda/birdnotion/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ferueda%2Fbirdnotion/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28760646,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T20:56:06.009Z","status":"ssl_error","status_checked_at":"2026-01-25T20:54:48.203Z","response_time":113,"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":[],"created_at":"2026-01-25T22:34:06.358Z","updated_at":"2026-01-25T22:34:07.129Z","avatar_url":"https://github.com/ferueda.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BirdNotion\n\nChrome extension to save tweets and articles to Notion with one click.\n\n## Features\n\n- Save any URL to your Notion database\n- Extract tweet content (text, author, images) from X/Twitter\n- Extract article content via Readability\n- Deduplicate by URL\n- Rate-limited Notion API client with automatic retry\n\n## Setup\n\n### Prerequisites\n\n- Node.js 22+\n- A Notion account with an integration\n\n### 1. Create Notion Integration\n\n1. Go to [notion.so/my-integrations](https://www.notion.so/my-integrations)\n2. Click **\"+ New integration\"**\n3. Give it a name (e.g., \"BirdNotion\")\n4. Select your workspace\n5. Click **\"Submit\"**\n6. Copy the **Internal Integration Secret** (starts with `secret_`)\n\n### 2. Create Notion Database\n\nCreate a new database in Notion with the following properties:\n\n| Property Name | Type | Required | Notes |\n|--------------|------|----------|-------|\n| **Title** | Title | ✅ | Auto-created, page title |\n| **URL** | URL | ✅ | Original page URL |\n| **Canonical URL** | Text | ✅ | Normalized URL for dedupe |\n| **Domain** | Text | ✅ | Extracted domain |\n| **Content Type** | Select | ✅ | Options: article, tweet, tool, other |\n| **Saved At** | Date | ✅ | Timestamp when saved |\n| **Tags** | Multi-select | ⚪ | Optional tags |\n\n**Quick Setup:**\n- Create the database as a full page (not inline)\n- Add each property using the \"+ New property\" button\n- Make sure property names match exactly (case-sensitive!)\n\n### 3. Share Database with Integration\n\n1. Open your database in Notion\n2. Click the `...` menu (top-right)\n3. Click **\"Connections\"** or **\"Add connections\"**\n4. Find your integration and add it\n5. Copy the **Database ID** from the URL:\n   - URL format: `https://notion.so/workspace/DatabaseName-{database_id}?v=...`\n   - Database ID is the 32-character string after the database name\n\n### 4. Install Extension\n\n```bash\n# Clone the repo\ngit clone https://github.com/your-username/birdnotion.git\ncd birdnotion\n\n# Install dependencies\nnpm install\n\n# Build the extension\nnpm run build\n```\n\n### 5. Load in Chrome\n\n1. Open `chrome://extensions`\n2. Enable **\"Developer mode\"** (toggle in top-right)\n3. Click **\"Load unpacked\"**\n4. Select the `dist/` folder\n\n### 6. Configure Extension\n\n1. Click the **BirdNotion extension icon** in Chrome toolbar\n2. Click **\"Settings\"** (or right-click → Options)\n3. Enter your:\n   - **Integration Token** (from step 1)\n   - **Database ID** (from step 3)\n4. Click **\"Test Connection\"**\n   - ✅ Should show: \"Token valid\", \"Database accessible\", \"All required properties found\"\n   - ❌ If errors, see Troubleshooting below\n5. Click **\"Save Settings\"**\n\n## Usage\n\n1. Navigate to any webpage or tweet\n2. Click the **BirdNotion icon**\n3. Optionally add tags or notes\n4. Click **\"Save to Notion\"**\n5. Click **\"Open in Notion\"** to view the saved page\n\n**Dedupe:** Saving the same URL again will show \"Already saved\" with a link to the existing page.\n\n## Troubleshooting\n\n### \"Could not find database\" error\n- Make sure the database is shared with your integration (step 3)\n- Verify you're using the database ID, not the page ID\n- Check that integration has access to the workspace\n\n### \"Missing properties\" error\n- Verify all required properties exist in your database\n- Property names must match exactly (case-sensitive)\n- Use property types shown in the table above\n\n### \"Page already saved\" on first save\n- The extension deduplicates by canonical URL\n- Check if a similar URL already exists in your database\n\n### Extension not appearing\n- Make sure you loaded the `dist/` folder, not the project root\n- Check `chrome://extensions` for any error messages\n- Try refreshing the extension (click refresh icon)\n\n## Development\n\n```bash\n# Watch mode (rebuilds on changes)\nnpm run dev\n\n# Run linter\nnpm run lint\n\n# Run type checker\nnpm run typecheck\n\n# Run tests\nnpm run test\n```\n\nAfter making changes, go to `chrome://extensions` and click the refresh icon on the BirdNotion card.\n\n## Project Structure\n\n```\nbirdnotion/\n├── manifest.json           # Chrome extension manifest (MV3)\n├── src/\n│   ├── background/         # Service worker\n│   ├── content/            # Content scripts (X extractor, article extractor)\n│   ├── popup/              # Extension popup UI\n│   ├── options/            # Settings page\n│   ├── lib/                # Shared utilities (Notion client, URL utils)\n│   └── types/              # TypeScript types\n├── scripts/                # Build and release scripts\n└── dist/                   # Built extension (gitignored)\n```\n\n## Release Process\n\n### Create a Release\n\n```bash\n# Patch release (0.1.0 → 0.1.1)\nnpm run release:patch\n\n# Minor release (0.1.0 → 0.2.0)\nnpm run release:minor\n\n# Major release (0.1.0 → 1.0.0)\nnpm run release:major\n```\n\nThis will:\n1. Bump version in `package.json` and `manifest.json`\n2. Update `CHANGELOG.md`\n3. Create a commit and tag\n4. Prompt to push to remote\n\nWhen pushed, GitHub Actions will automatically create a release with the packaged extension.\n\n### Manual Package\n\n```bash\nnpm run package\n```\n\nCreates `birdnotion.zip` in the project root.\n\n## Tech Stack\n\n- TypeScript\n- Vite + @crxjs/vite-plugin\n- Chrome Extension Manifest V3\n- Notion API (2025-09-03)\n- @mozilla/readability\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fferueda%2Fbirdnotion","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fferueda%2Fbirdnotion","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fferueda%2Fbirdnotion/lists"}