Built with Droid
A private social media feed aggregator for tracking mentions and content across Twitter, Reddit, and GitHub. Perfect for monitoring brand mentions, competitor activity, or topic-specific content. Runs on GitHub Pages with automated scraping via GitHub Actions.
- π’ Brand monitoring - Track mentions of your company/product across social platforms
- π Competitor analysis - Monitor competitor activity and announcements
- π° Topic research - Aggregate content about specific topics or technologies
- π Developer relations - Track community discussions, issues, and feedback
- π Market research - Monitor trends, sentiment, and conversations in your industry
- π Token-gated access - Private viewing with SHA-256 token authentication
- π€ Automated scraping - GitHub Actions runs every 10 minutes
- π± Mobile-optimized - Responsive design with touch-friendly controls
- β¨οΈ Keyboard shortcuts - Vim-style navigation (J/K), Cmd+K command palette
- π¨ Dark mode - Toggle light/dark themes
- π View modes - Compact or Detailed display with automatic content expansion
- π·οΈ Smart filtering - By source (Twitter/Reddit/GitHub), category, and time range
- π€ Hidden authors - Filter out posts from specific users (case-insensitive)
- π¦ Bulk actions - Archive, multi-select, shift-click range selection
- π― Category tags - Auto-classified posts (mentions, bugs, love, questions)
- π Stats dashboard - Visual analytics with color-coded charts
- π§Ή Clean UI - Collapsed @mentions, collapsible command help
- βοΈ Configurable - Edit feed sources and settings via UI
Frontend: Static HTML/CSS/JS served by GitHub Pages
Backend: Node.js scrapers run via GitHub Actions
Data: Static JSON file updated by Actions
Access: SHA-256 hashed token stored in localStorage
- Node.js 18+
- GitHub account
- GitHub CLI (
gh) installed - API tokens:
- GitHub Personal Access Token (for GitHub GraphQL API)
- Apify API Token (for Twitter scraping)
-
Clone and install:
git clone <your-repo-url> cd factory-feed-viewer npm install
-
Configure environment:
cp .env.example .env # Edit .env and add your API tokens -
Run locally:
npm start # Visit http://localhost:3000 -
Test scraper:
node src/scraper-cli.js # Outputs to public/data/feed.json
-
Create private repository:
gh repo create social-feed-aggregator --private --source=. --remote=origin --push
-
Add GitHub Secrets (Settings > Secrets and variables > Actions):
GH_PAT: Your GitHub Personal Access Token (Note: GitHub doesn't allow secrets starting withGITHUB_)GH_REPO: GitHub repository to track in formatowner/repo(e.g.,Factory-AI/factory)APIFY_TOKEN: Your Apify API token for Twitter scrapingTEAM_TWITTER_USERNAMES: (Optional) Usernames to filter out (e.g.,YourCompanyBot)
-
Enable GitHub Pages:
- Go to Settings > Pages
- Source: Deploy from branch
main - Folder:
/docs - Save
-
Generate access token:
echo -n "your_password" | shasum -a 256 # Copy the hash and update ACCESS_TOKEN_HASH in docs/index.html
-
Trigger first scrape:
- Go to Actions tab
- Run "Scrape Feeds" workflow manually
- Verify
docs/data/feed.jsonis created
-
Access site:
- Visit your GitHub Pages URL:
https://<username>.github.io/social-feed-aggregator/ - Enter your access token
- Feed should load!
- Visit your GitHub Pages URL:
Edit via Settings UI (βοΈ icon) to configure:
Hidden Authors - Filter out posts from specific users:
{
"hiddenAuthors": ["bentossell", "companybot", "spamaccount"]
}Feed Sources - Modify docs/config.json:
{
"twitter": {
"searchTerms": ["yourcompany", "yourproduct"],
"excludeUsernames": ["YourCompanyAccount"]
},
"reddit": {
"urls": [
"https://www.reddit.com/search/?q=yourcompany&type=link&sort=new",
"https://www.reddit.com/r/YourIndustry/search/?q=yourcompany&restrict_sr=1&sort=new"
]
},
"github": {
"usernames": ["yourorg", "competitor1", "competitor2"],
"topics": ["ai", "llm", "machine-learning"]
}
}Edit .github/workflows/scrape-feeds.yml:
schedule:
- cron: '*/10 * * * *' # Every 10 minutes
# Change to '*/30 * * * *' for every 30 minutes (recommended for free tier)To change the access password:
echo -n "new_password" | shasum -a 256Update ACCESS_TOKEN_HASH in public/index.html with the new hash.
| Key | Action |
|---|---|
J / β |
Navigate down |
K / β |
Navigate up |
X |
Select/deselect current item |
Shift+X |
Toggle multi-select mode |
E |
Archive selected items |
Enter |
Open focused item |
Cmd/Ctrl+Enter |
Open in new tab |
R |
Refresh feed |
Esc |
Clear selection |
Cmd/Ctrl+K |
Toggle commands help |
β |
Collapse sidebar |
β |
Expand sidebar |
- Click card: Select/deselect (or open in multi-select mode)
- Shift+Click: Range select (like Excel)
- Cmd/Ctrl+Click: Open URL in new tab
- Click source pill: Filter by Twitter/Reddit/GitHub
- Click category pill: Filter by mentions/bugs/love/questions
- Click sidebar overlay (mobile): Close sidebar
| Service | Limit | Notes |
|---|---|---|
| GitHub | 5,000 req/hr | Authenticated GraphQL |
| ~60 req/min | Public feeds | |
| Via Apify | Check usage dashboard | |
| GitHub Actions | 2,000 min/month | Free tier |
- β
.envis gitignored - β All secrets in GitHub Secrets
- β Access token is SHA-256 hashed
- β Private repository
- β No API keys in code or commits
See AGENTS.md for detailed security practices.
Weekly: Check Actions tab for successful runs
Monthly: Update dependencies (npm update)
As needed: Rotate tokens if compromised
- Check Actions tab for errors
- Verify GitHub Secrets are set correctly
- Clear browser cache
- Verify access token hash matches
- Check GitHub Pages is enabled
- Try incognito/private browsing mode
- Check API tokens are valid
- Verify rate limits not exceeded
- Review Actions logs for errors
We welcome contributions! Whether it's bug fixes, new features, documentation improvements, or new scrapers - all PRs are appreciated.
See CONTRIBUTING.md for:
- How to set up your development environment
- Code style guidelines
- How to add new scrapers
- Pull request process
Quick start:
- Fork the repo
- Create a feature branch
- Make your changes
- Submit a PR
For questions or discussions, open an issue.
ISC