plugins/omi-github-app/COMPARISON.md
Both apps follow the same architecture pattern but are customized for their respective platforms.
✅ FastAPI backend ✅ File-based storage with Railway persistence ✅ OAuth 2.0 authentication ✅ OMI webhook integration ✅ AI-powered content processing (OpenAI) ✅ Mobile-first UI ✅ Session management for segment collection
| Feature | Twitter App | GitHub App |
|---|---|---|
| Trigger phrase | "Tweet Now" | "Feedback Post" |
| Segments collected | 3 | 5 |
| Reasoning | Quick tweets (10-15s) | Detailed issues (15-20s) |
| Feature | Twitter App | GitHub App |
|---|---|---|
| OAuth Provider | Twitter OAuth 2.0 (Tweepy) | GitHub OAuth 2.0 (direct) |
| Scopes | tweet.read, tweet.write, users.read | repo |
| Token Refresh | Automatic refresh token handling | No refresh (long-lived tokens) |
| OAuth Library | Tweepy's OAuth2UserHandler | Direct requests |
| Feature | Twitter App | GitHub App |
|---|---|---|
| AI Output | Single cleaned tweet text | Title + Description |
| Formatting | Tweet cleanup (280 chars) | Professional issue format |
| Extra features | Filler word removal | Structure: problem, context, details |
| Feature | Twitter App | GitHub App |
|---|---|---|
| Configuration | None (just auth) | Repository selection |
| Homepage | Simple instructions | Full settings page |
| Settings Updates | N/A | Change repo anytime |
| Repo Management | N/A | Refresh repos, select target |
| Feature | Twitter App | GitHub App |
|---|---|---|
| Creates | Tweet on Twitter | Issue on GitHub |
| Returns | Tweet text + ID | Issue title + number + URL |
| Labels | N/A | Adds "voice-feedback" label |
| Format | Single text string | Title + multi-line description |
/apps/twitter/)main_simple.py # Main FastAPI app
twitter_client.py # Twitter API with Tweepy
tweet_detector.py # Tweet extraction + AI cleanup
simple_storage.py # Users + sessions storage
/apps/github/)main.py # Main FastAPI app + mobile UI
github_client.py # GitHub API (direct requests)
issue_detector.py # Issue generation + AI formatting
simple_storage.py # Users + sessions + repo prefs
# Collect 3 segments
if segments_count >= 3:
# AI extracts single tweet
cleaned_content = await tweet_detector.ai_extract_tweet_from_segments(accumulated)
# Post tweet
result = await twitter_client.post_tweet(access_token, cleaned_content)
# Collect 5 segments
if segments_count >= 5:
# AI generates title + description
title, description = await issue_detector.ai_generate_issue_from_segments(accumulated)
# Create issue
result = await github_client.create_issue(access_token, repo_full_name, title, description)
users[uid] = {
"uid": uid,
"access_token": ...,
"refresh_token": ...,
"expires_at": ...
}
users[uid] = {
"uid": uid,
"access_token": ...,
"github_username": ...,
"selected_repo": ..., # NEW: repo selection
"available_repos": [...] # NEW: repo list
}
Both apps:
/app/data volumeThe GitHub app is essentially the Twitter app enhanced with: