Gwitter
July 13, 2025 ยท View on GitHub
๐ฎ Playground
- ๐ Live Demo: https://simonaking.com/Gwitter - Experience Gwitter in action
- ๐ญ Share Your Thoughts: Create an Issue to join the conversation
- ๐ Browse Discussions: Explore existing thoughts and insights on the demo site
โจ Project Introduction
โจ The Story Behind "Gwitter"
Ever wondered what happens when you combine the world's most powerful issue tracker with the globe's favorite microblogging platform? ๐ค
GitHub Issues ๐ = The unsung hero of note-taking (seriously, it's brilliant!)
Twitter ๐ฆ = Where thoughts become conversations worldwide
Gwitter ๐ = Turn GitHub Issues into your personal microblog platform!

๐ฑ Author's Gwitter: https://simonaking.com/blog/weibo/ - See how Gwitter is used in practice
Gwitter is a lightweight microblogging application built on GitHub Issues. It records my thoughts on technology, life insights, and interesting discoveries. Welcome to join the discussion!
๐ Key Features
- ๐ GitHub Issues Based
- Utilizes GitHub Issues as content storage, supporting GitHub's label system for content categorization
- ๐ Social Interaction
- Like Feature: Supports GitHub Reactions (๐ โค๏ธ ๐ ๐ฎ ๐ข ๐ก ๐ ๐)
- Comment System: Complete commenting functionality with nested replies support
- โจ Visual Experience
- Beautiful Animations: Smooth page animations using Framer Motion
- Responsive Design: Perfect adaptation for desktop, tablet, and mobile devices
- Skeleton Screen: Elegant loading state display
- ๐ User Experience
- Internationalization Support: Built-in Chinese and English bilingual support
- Infinite Scroll: Smart pagination loading for smooth browsing experience
- ๐ค Automated Synchronization
- Multi-platform Sync: Automatically sync newly published Issues to other platforms via GitHub Actions
๐ Usage Instructions
Publishing Content
- Create a new Issue in the configured GitHub repository
- Write content using Markdown format
- Add appropriate labels for categorization
- Content will automatically sync to the gwitter application after publishing
Content Management
- Edit: Edit directly in GitHub Issues
- Delete: Close the corresponding Issue
- Categorize: Use GitHub Labels for content categorization
- Pin: Control display order through Issue creation sequence
๐ค Automated Synchronization Configuration
Gwitter supports automatically syncing newly published Issues to Telegram and GitHub Gist via GitHub Actions.
-
Create Sync Script
- Refer to sync.js implementation
- Create
.github/workflows/sync.ymlin the repository
-
Configure Environment Variables In GitHub repository Settings > Secrets and variables
-
Telegram Configuration
- Create Telegram Bot (via @BotFather)
- Get Bot Token and target channel/group Chat ID
- Add Bot to target channel and grant admin permissions
๐ ๏ธ Tech Stack
- Frontend Framework: React 18 + TypeScript
- Build Tool: Rsbuild (Fast build tool based on Rspack)
- Styling Solution: Emotion (CSS-in-JS)
- Animation Library: Framer Motion + React Flip Move
- State Management: React Hooks
- Network Requests: Axios + GitHub GraphQL API
- Internationalization: i18next
- Code Standards: ESLint + Prettier
Gwitter/
โโโ src/ # Main source code
โ โโโ components/ # React components
โ โ โโโ common/ # Shared UI components
โ โ โโโ About.tsx # About page component
โ โ โโโ CommentInput.tsx # Comment input component
โ โ โโโ ...
โ โโโ hooks/ # Custom React hooks
โ โ โโโ useAuth.tsx # Authentication hook
โ โโโ utils/ # Utility functions
โ โ โโโ cache.ts # Caching utilities
โ โ โโโ request.ts # API request utilities
โ โ โโโ index.ts # Common utilities
โ โโโ config/ # Configuration files
โ โ โโโ index.ts # Main configuration
โ โโโ i18n/ # Internationalization
โ โ โโโ index.ts # i18n setup
โ โ โโโ locales/ # Language files
โ โโโ types/ # TypeScript type definitions
โ โ โโโ global.d.ts # Global types
โ โโโ lib/ # External libraries
โ โโโ collapse.js # UI collapse functionality
โโโ demo/ # Demo examples
โ โโโ npm-demo/ # NPM/React demo
โ โ โโโ src/ # React source files
โ โ โ โโโ App.tsx # Main demo component
โ โ โ โโโ config/ # Demo configuration
โ โ โ โโโ ...
โ โ โโโ package.json # Dependencies
โ โ โโโ vite.config.ts # Build config
โ โโโ umd-demo/ # UMD/Browser demo
โ โ โโโ index.html # Complete HTML demo
โ โโโ README.md # Demo documentation
โโโ docs/ # Documentation assets
โ โโโ *.png # Setup screenshots
โโโ dist/ # Built files for distribution
โโโ gwitter.min.js # UMD bundle
โโโ gwitter.min.css # Styles
๐ฆ Installation & Usage
๐ฏ Quick Start: Check out our live demos to see Gwitter in action!
๐ Demo Examples
Two demo examples to get you started:
๐ง NPM Demo - React Development
For modern React applications with build tools.
cd demo/npm-demo
npm install
npm run dev
๐ UMD Demo - Browser Integration
For existing websites without build tools.
<!-- Just open index.html in your browser -->
<script src="https://unpkg.com/gwitter/dist/gwitter.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/gwitter/dist/gwitter.min.css">
๐ Setup Requirements
Both demos need GitHub configuration:
- Create a GitHub repository for your content
- Generate a Personal Access Token with
repoandread:userpermissions - Create a GitHub OAuth Application
- Update demo config files with your details
See Configuration Setup for detailed instructions.
Method 1: NPM Installation (Recommended)
For modern JavaScript projects using module bundlers:
Requirements
- React: ^18.0.0 or higher
- React DOM: ^18.0.0 or higher
Installation
npm install gwitter react react-dom
# or
yarn add gwitter react react-dom
Usage
import gwitter from 'gwitter';
import 'gwitter/dist/gwitter.min.css';
gwitter({
container: document.getElementById('comments'),
config: {
request: {
// GitHub Personal Access Token
token: ['your_token_part1', 'your_token_part2'],
// OAuth configuration
clientID: 'your_github_oauth_client_id',
clientSecret: 'your_github_oauth_client_secret',
// GitHub repository configuration
owner: 'your_github_username',
repo: 'your_repo_name',
// Pagination configuration
pageSize: 6,
// CORS proxy (optional)
autoProxy: 'https://cors-anywhere.azm.workers.dev/https://github.com/login/oauth/access_token',
},
app: {
// Application feature toggles
onlyShowOwner: false,
enableRepoSwitcher: false,
enableAbout: false,
enableEgg: false,
},
}
});
Method 2: UMD (Browser)
For direct browser usage without build tools:
<!-- Include React and ReactDOM -->
<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
<!-- Include Gwitter -->
<script src="https://unpkg.com/gwitter/dist/gwitter.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/gwitter/dist/gwitter.min.css">
<script>
gwitter({
container: document.getElementById('comments'),
config: {
request: {
// GitHub Personal Access Token
token: ['your_token_part1', 'your_token_part2'],
// OAuth configuration
clientID: 'your_github_oauth_client_id',
clientSecret: 'your_github_oauth_client_secret',
// GitHub repository configuration
owner: 'your_github_username',
repo: 'your_repo_name',
// Pagination configuration
pageSize: 6,
// CORS proxy (optional)
autoProxy: 'https://cors-anywhere.azm.workers.dev/https://github.com/login/oauth/access_token',
},
app: {
// Application feature toggles
onlyShowOwner: false,
enableRepoSwitcher: false,
enableAbout: false,
enableEgg: false,
},
}
});
</script>
3. Configuration Setup
Before using Gwitter, you need to set up GitHub configuration:
3.1 Create GitHub Repository
- Create a new repository on GitHub to store your microblog content
- Record the repository's
owner(username) andrepo(repository name)
Similar to https://github.com/SimonAKing/weibo/issues
![]()
3.2 Apply for GitHub Personal Access Token
-
Visit GitHub Settings > Developer settings > Personal access tokens
-
Click "Generate new token (classic)"
-
Select the following permissions:
repo(Full repository access)read:user(Read user information)
-
Generate and save the token
3.3 Create GitHub OAuth Application
-
Click "New OAuth App"
-
Fill in application information:
- Application name: Gwitter
- Homepage URL: Your deployment domain
- Authorization callback URL: Your deployment domain
-
After creation, obtain
Client IDandClient Secret
4. API Reference
gwitter(options)
Main function to initialize and render Gwitter.
Parameters:
options(Object): Configuration options for Gwitter
options.container (HTMLElement | string) - Required
- The DOM element or CSS selector where Gwitter will be rendered
- Example:
document.getElementById('comments')or'#comments'
options.config (Object) - Required
- Configuration object containing request and app settings
options.config.request (Object) - Required
- GitHub API and authentication configuration
| Property | Type | Required | Description | Example |
|---|---|---|---|---|
token | string[] | โ | GitHub Personal Access Token split into two parts for security | ['ghp_xxxx', 'xxxx'] |
clientID | string | โ | GitHub OAuth Application Client ID | 'your_client_id' |
clientSecret | string | โ | GitHub OAuth Application Client Secret | 'your_client_secret' |
owner | string | โ | GitHub repository owner (username) | 'your_username' |
repo | string | โ | GitHub repository name | 'your_repo_name' |
pageSize | number | โ | Number of issues to load per page (default: 6) | 6 |
autoProxy | string | โ | CORS proxy URL for OAuth requests | 'https://cors-anywhere.azm.workers.dev/https://github.com/login/oauth/access_token' |
options.config.app (Object) - Optional
- Application behavior configuration
| Property | Type | Default | Description | Example |
|---|---|---|---|---|
onlyShowOwner | boolean | false | Show only repository owner's issues | false |
enableRepoSwitcher | boolean | false | Enable repository switching functionality | false |
enableAbout | boolean | false | Show About page/section | false |
enableEgg | boolean | false | Enable easter egg features | false |
Returns:
Promise<void>- Resolves when Gwitter is successfully initialized
Example:
gwitter({
container: '#comments',
config: {
request: {
token: ['ghp_xxxx', 'xxxx'],
clientID: 'your_client_id',
clientSecret: 'your_client_secret',
owner: 'your_username',
repo: 'your_repo_name',
pageSize: 10,
},
app: {
onlyShowOwner: true,
enableAbout: true,
}
}
});
๐ค Contributing
Issues and Pull Requests are welcome!
Thank you for your attention and support!
If you like this project, don't forget to give it a โญ!
Made with โค๏ธ by SimonAKing