Share and amplify your team's AI knowledge.
Hosted for free with GitHub Pages, backed by simple .md files.
https://ole-vi.github.io/prompt-sharing/
PromptSync is a zero-build web application for managing and sharing AI prompts as markdown files. It provides a browsable library interface with deep linking, GitHub integration, and direct integration with Google's Jules AI assistant. Teams can organize prompts in folders, switch between branches, and send prompts directly to Jules with full context awareness.
- Prompt Library: Browse and share prompts organized in a GitHub repository.
- Jules Integration: Send prompts directly to Google's Jules AI coding agent.
- Task Queue: Queue up multiple subtasks for Jules to execute sequentially.
- Session Management: View and manage your active and past Jules sessions.
- Web Capture: A browser extension that lets you capture any webpage as Markdown and sync it directly to your GitHub repository. See browser-extension/README.md for details.
To test the app locally, you must serve it over HTTP (not open the HTML file directly):
# From the repo root
python -m http.server 8888Then open http://localhost:8888/pages/home/index.html in your browser.
Important: Opening index.html directly (via file:// URL) will not work with Firebase authentication. The app must be served over HTTP for GitHub OAuth to function.
This is a zero-build, modular single-page application using plain JavaScript ES6 modules.
- No Build Step: Files served directly from GitHub Pages
- No Framework: Plain JavaScript with ES6 modules
- Modular: Each feature is isolated in its own module
- Zero Dependencies: Only CDN-loaded libraries (marked.js, Firebase)
- Fast: Caching, lazy loading, and optimized rendering
- Aggregator: See src/styles.css for ordered imports.
- Base: src/styles/base.css defines variables and resets.
- Layout: src/styles/layout.css contains grid and responsive rules.
- Components: Modular styles in src/styles/components/ (header, navbar, sidebar, buttons, status bar, etc.).
- Pages: Per-page overrides in src/styles/pages/.
Guidelines:
- Keep base/layout first, components next, pages last in the aggregator.
- Add new components under
src/styles/components/and import them insrc/styles.css. - Use page styles sparingly for view-specific tweaks.
prompt-sharing/
βββ pages/ # Routed pages
β βββ home/index.html # Home / Prompt Library
β βββ jules/jules.html # Jules account management & sessions
β βββ queue/queue.html # Jules task queue management
β βββ sessions/sessions.html # Full list of Jules sessions
β βββ profile/profile.html # User profile & settings
β βββ webcapture/webcapture.html # Web Capture extension
βββ partials/
β βββ header.html # Shared header partial (loaded on all pages)
βββ src/firebase-init.js # Firebase SDK initialization (src)
βββ firebase.json # Firebase hosting config
βββ config/
β βββ firestore/firestore.rules # Firestore security rules
βββ oauth-callback.html # GitHub OAuth callback for extension
βββ src/
β βββ app.js # Main application initialization
β βββ shared-init.js # Shared initialization for all pages
β βββ styles.css # Aggregated stylesheet importing modular CSS
β βββ modules/ # Feature modules (ES6)
β β βββ auth.js # GitHub OAuth & auth state management
β β βββ jules.js # Jules integration, modals, queue system
β β βββ jules-api.js # Jules API client (sources, sessions, activities)
β β βββ github-api.js # GitHub API calls & Gist handling
β β βββ prompt-list.js # Sidebar tree navigation & rendering
β β βββ prompt-renderer.js # Markdown rendering & display
β β βββ branch-selector.js # Branch listing & switching
β β βββ subtask-manager.js # Prompt splitting & parsing
β β βββ header.js # Shared header component
β β βββ navbar.js # Shared navigation component
β β βββ status-bar.js # Status notifications
β βββ utils/ # Shared utilities
β βββ constants.js # Config, regex patterns, storage keys
β βββ slug.js # URL-safe slug generation
β βββ url-params.js # URL parameter parsing
β βββ dom-helpers.js # DOM manipulation helpers
β βββ session-cache.js # Session data caching
β βββ title.js # Title extraction from prompts
βββ prompts/ # Markdown prompt files
β βββ planet/ # Planet repo onboarding
β βββ myplanet/ # myPlanet repo onboarding
β βββ promptsync/ # PromptSync repo onboarding
βββ webclips/ # User web clips from browser extension
β βββ {username}/ # Each user's synced clips
βββ browser-extension/ # Web capture browser extension
β βββ manifest.json # Extension configuration
β βββ content.js # Page content extraction
β βββ popup.html/js # Extension UI
β βββ config.js # OAuth configuration
β βββ github-auth.js # GitHub OAuth flow
β βββ github-sync.js # GitHub sync logic
β βββ background.js # Service worker
βββ functions/ # Firebase Cloud Functions
βββ index.js # Jules backend + GitHub OAuth proxy
βββ package.json
-
Create a new file inside the
prompts/folder.- Use lowercase filenames with no spaces. Example:
my-new-prompt.md. - File must end with
.md.
- Use lowercase filenames with no spaces. Example:
-
Start the file with a first-level heading (
#) for the title:# My New Prompt Prompt instructions go here... -
Commit the file to the
mainbranch:-
Either upload directly through the GitHub web UI, or
-
Use git locally:
git add prompts/my-new-prompt.md git commit -m "Add my-new-prompt.md" git push
-
-
After a minute or two, the live site will auto-refresh to include your new prompt.
Instead of storing the full prompt in this repo, you can point a prompt file at a GitHub Gist. Create a markdown file whose entire body is the raw Gist URL:
https://gist.githubusercontent.com/your-username/abc123456789/raw/my-shared-prompt.mdThe app will fetch and cache the Gist content automatically.
Limitations:
- Must be a publicly readable
gist.githubusercontent.comraw link - Only one URL per file
- Updates to the Gist appear on next fetch
If a prompt file contains only a ChatGPT conversation URL (e.g., https://chatgpt.com/s/...), the app detects it and provides a clickable link to open the conversation.
Every prompt has its own URL:
https://ole-vi.github.io/prompt-sharing/#p=<filename-without-.md>
Example:
- File:
prompts/stubs.md - Link: https://ole-vi.github.io/prompt-sharing/#p=stubs
These links can be shared in Discord, Whatsapp, docs, etc.
- Prompt Library Browser: Navigate prompts organized in folders with a collapsible tree view
- Markdown Rendering: Full markdown support with headings, lists, code blocks, and more
- Deep Linking: Every prompt has a shareable URL (
#p=slug) - Branch Switching: Switch between git branches to view different versions of your prompt library
- Search: Filter prompts by filename in real-time
- One-Click Copy: Copy prompt text to clipboard with a single click
- Gist Integration: Reference GitHub Gists as external prompt sources
- ChatGPT/Codex Links: Automatically detect and link to ChatGPT conversation URLs
- Emoji Tags: Automatic visual categorization based on filename keywords
- GitHub OAuth: Sign in with your GitHub account via Firebase
- Persistent Sessions: Stay logged in across browser sessions
- User Profile: Access your Jules profile and settings
PromptSync provides deep integration with Google's Jules AI assistant:
- One-Click Sending: Send any prompt directly to Jules with the "β‘ Try in Jules" button
- Repository Context: Select which GitHub repository Jules should use
- Branch Selection: Choose specific branches for Jules to access
- Custom Titles: Name your Jules sessions for easy identification
- Auto-Open: Automatically open Jules sessions in new tabs
- Batch Processing: Queue multiple prompts to send to Jules
- Queue Management: View, edit, and delete queued items
- Status Tracking: Monitor pending, processing, and completed items
- Auto-Open Control: Choose whether to automatically open Jules tabs
- Intelligent Parsing: Automatically detect task stubs, numbered lists, or paragraph breaks
- Manual Splitting: Define custom
---split---markers in prompts - Preview & Edit: Review and modify detected subtasks before sending
- Sequential Execution: Send subtasks to Jules one at a time or all at once
- Context Preservation: Each subtask includes the full prompt context
Click your username after signing in to access:
- API Key Management:
- Securely store your Jules API key (encrypted in Firestore)
- Update or delete your stored key
- Keys are encrypted using AES-GCM with your user ID
- Connected Repositories:
- View all GitHub repos connected via Jules GitHub App
- See available branches for each repository
- Refresh to sync latest connections
- Recent Sessions:
- Last 10 Jules sessions with titles and status
- Direct links to Jules sessions and pull requests
- Status indicators (active, completed, errored)
- "View All β" to see complete session history
- Full Sessions History Modal:
- Browse all your Jules sessions
- Search by conversation title or session ID
- Paginated loading (50 sessions at a time)
- Session cards with timestamps and links
- Multi-Repository Support: Browse prompts from any GitHub repository
- URL Parameters: Share links with custom owner/repo/branch
- Cache Management: Automatic caching with session storage
- Real-Time Updates: Changes appear 1-2 minutes after pushing to GitHub
PromptSync includes a powerful browser extension that captures any webpage as Markdown and syncs it to GitHub.
- πΈ One-Click Capture: Save any webpage as clean Markdown
- βοΈ GitHub Sync: Automatically commit clips to this repository
- π OAuth Login: Secure GitHub authentication (no PAT needed)
- πΎ Local Download: Option to save locally without GitHub
- π₯ Multi-User: Each user gets their own folder in
webclips/
- Install Extension: Load
browser-extensionfolder in Chrome (chrome://extensions/) - Connect GitHub: Click "π Connect to GitHub" in extension popup
- Clip Pages: Click extension icon, then "βοΈ Sync to GitHub"
- View Clips: Find them at
webclips/{your-username}/
See browser-extension/README.md for full documentation.
See DEPLOYMENT_GUIDE.md for setup instructions and QUICKSTART.md for user guide.
- Sign in: Click "Sign in with GitHub" in the header
- Add API Key: Click your username β "Add Jules API Key"
- Get your key from jules.google.com β Settings β API Keys
- Your key is encrypted and stored securely
- Browse Prompts: Navigate the prompt library and find a useful prompt
- Send to Jules: Click "β‘ Try in Jules" on any prompt
- Configure: Select repository and branch for context
- Track Sessions: View your Jules activity in your profile
The app automatically adds emojis to filenames for visual categorization:
- π - Code review, PR, rubric
- π©Ή - Bug fixes, triage
- π - Documentation, specs, design, explorers
- π§Ή - Refactoring
These are purely cosmetic and based on keywords in the filename.
- Repository must remain public for GitHub Pages and API access
- Changes appear live 1β2 minutes after pushing to
main - No in-browser editing; manage prompts via git or GitHub web interface
- Browser caching may require hard refresh (Ctrl+Shift+R) after updates
- Firebase configuration required for authentication features
- Jules integration requires valid Jules API key from jules.google.com
- Team Onboarding: Repository explorer prompts help new contributors understand codebases
- Prompt Library: Centralized collection of reusable AI prompts
- Knowledge Sharing: Share effective prompts across your organization
- Jules Workflow: Streamline sending prompts to Jules with proper context
- Documentation: Living documentation that AI assistants can consume
- Best Practices: Capture and share successful prompt patterns
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Test locally with
python -m http.server 8888 - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is open source. See repository for license details.
For issues, questions, or feature requests, please open an issue on GitHub.
cd prompt-sharing
python -m http.server 8888
# Visit http://localhost:8888/pages/home/index.htmlRouting notes:
- Hosting redirects
/to/pages/home/index.htmlviafirebase.json. - Legacy root pages have been removed; use
/pages/*paths.
The dev setup loads modules directly without compilation. Changes are reflected immediately (reload browser).
Each module in src/modules/ handles one major feature area:
- auth.js: Firebase authentication, GitHub OAuth flow, user state management
- jules.js: Complete Jules integration including:
- API key encryption and storage
- "Try in Jules" workflow with repository/branch selection
- Queue system for batch processing
- Subtask splitting and management
- User profile modal with sessions history
- All Jules-related modals and UI
- jules-api.js: Jules API client wrapper:
- List connected sources (repositories)
- Retrieve sessions with filtering and pagination
- Fetch activity logs
- Handle API authentication
- github-api.js: GitHub API interactions:
- Fetch repository contents and file trees
- Load raw markdown files
- Resolve and fetch GitHub Gists
- List repository branches
- prompt-list.js: Sidebar prompt browser:
- Tree-based folder navigation
- Collapsible folders with state persistence
- Search/filter functionality
- Active item highlighting
- prompt-renderer.js: Content display:
- Markdown rendering with marked.js
- Code syntax highlighting
- Copy to clipboard functionality
- Deep linking support
- branch-selector.js: Branch management:
- List available branches
- Switch between branches
- User/feature branch filtering
- subtask-manager.js: Prompt parsing and splitting:
- Detect task stubs, numbered lists, manual splits
- Analyze prompt structure
- Build subtask sequences with context
- Validate subtask integrity
- status-bar.js: User notifications and status messages
Utilities in src/utils/ provide shared helpers:
- constants.js: All configuration, magic strings, regex patterns, emoji mappings, storage keys
- slug.js: Generate URL-safe slugs from filenames
- url-params.js: Parse URL query strings and hash parameters
- dom-helpers.js: Reusable DOM manipulation functions
- title.js: Extract titles from markdown content
- ES6 modules with explicit imports/exports
- No transpilation or build step required
- Plain JavaScript (no frameworks or libraries except CDN-loaded dependencies)
- Modular architecture with clear separation of concerns
- Async/await for asynchronous operations
- SessionStorage for caching and state persistence
- Firestore for secure data storage (API keys, queue items)
- Frontend: Vanilla JavaScript (ES6 modules), HTML5, CSS3
- Markdown: marked.js (CDN)
- Authentication: Firebase Authentication (GitHub OAuth)
- Database: Cloud Firestore
- Backend: Firebase Cloud Functions (Node.js)
- Hosting: GitHub Pages
- APIs: GitHub REST API, Jules API (Google)
- API Key Encryption: Jules API keys encrypted using AES-GCM before storage
- Firestore Rules: Strict security rules ensuring users can only access their own data
- GitHub OAuth: Secure authentication flow via Firebase
- HTTPS Only: All API calls and hosting over HTTPS