A complete GitHub-native meeting submission system with GitHub OAuth authentication. Users can submit meeting records through a static web interface hosted on GitHub Pages, with all data stored in the repository via GitHub Actions.
- GitHub OAuth Authentication: Users must authenticate with their GitHub account
- Static Frontend: No external servers required - runs entirely on GitHub Pages
- Automated Workflows: GitHub Actions handle OAuth exchange and data storage
- Meeting Records: Track title, date, participants, topics, decisions, actions, and notes
- Dashboard: View all submitted meetings in a clean interface
- Audit Trail: Each submission records who submitted it and when
- Go to GitHub Developer Settings
- Click "New OAuth App"
- Fill in the application details:
- Application name:
Meeting Archive Submission - Homepage URL:
https://singularitynet-archive.github.io/Prototype-Meeting-Archives/ - Authorization callback URL:
https://singularitynet-archive.github.io/Prototype-Meeting-Archives/
- Application name:
- Click "Register application"
- Save the Client ID (you'll need this for step 3)
- Click "Generate a new client secret" and save it securely (you'll need this for step 2)
Add the following secrets to your GitHub repository:
- Go to Settings → Secrets and variables → Actions
- Click "New repository secret" and add:
- Name:
OAUTH_CLIENT_ID - Value: Your GitHub OAuth App Client ID
- Name:
- Click "New repository secret" again and add:
- Name:
OAUTH_CLIENT_SECRET - Value: Your GitHub OAuth App Client Secret
- Name:
The frontend needs a classic PAT to trigger workflows:
- Go to GitHub Token Settings (Classic)
- Click "Generate new token" → "Generate new token (classic)"
- Configure the token:
- Note:
Meeting Archive Workflow Trigger - Expiration: Choose your preferred duration (90 days recommended)
- Select scopes:
- ✅
public_repo(if repository is public) - Access public repositories - ✅
repo(if repository is private) - Full control of private repositories - Note: Either scope includes the ability to trigger Actions workflows
- ✅
- Note:
- Click "Generate token" and save it securely
- The token will start with
ghp_
Note: We use classic PATs instead of fine-grained PATs because organizations may restrict fine-grained token access. Classic tokens with public_repo scope are simpler and work reliably with organization repositories.
Important: Never commit credentials to the repository!
-
Copy the example config file:
cp config.example.js config.js
-
Edit
config.jsand add your credentials:const CONFIG = { // Replace with your GitHub OAuth App Client ID from step 1 GITHUB_CLIENT_ID: 'Ov23abc123def456...', // Replace with your classic PAT from step 3 (starts with ghp_) GITHUB_PAT: 'ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', // These are already set correctly REPO_OWNER: 'SingularityNET-Archive', REPO_NAME: 'Prototype-Meeting-Archives', REDIRECT_URI: 'https://singularitynet-archive.github.io/Prototype-Meeting-Archives/' };
-
Verify that
config.jsis listed in.gitignore(it should be by default)
Note: config.js is gitignored and will NEVER be committed to the repository. This keeps your credentials secure.
For GitHub Pages to work, we need to add your credentials as secrets:
- Go to Settings → Secrets and variables → Actions
- Click "New repository secret" and add:
- Name:
WORKFLOW_PAT - Value: Your classic PAT from step 3
- Name:
- (The
OAUTH_CLIENT_IDsecret should already exist from step 2)
Note: These secrets are used by the GitHub Actions deployment workflow to generate config.js during deployment. Secret names cannot start with GITHUB_ as that's reserved by GitHub.
- Go to Settings → Pages
- Under Source, select:
- Source:
GitHub Actions
- Source:
- The site will automatically deploy on every push to main
- Wait a few minutes for the first deployment
- Your site will be available at:
https://singularitynet-archive.github.io/Prototype-Meeting-Archives/
Since config.js is gitignored, your credentials will NOT be committed:
git add .
git commit -m "Initial setup of meeting archive system"
git push origin mainVerify: Make sure config.js is NOT in your git status output before committing!
- User clicks "Login with GitHub" on the frontend
- User is redirected to GitHub OAuth authorization page
- After authorization, GitHub redirects back with an OAuth code
- User fills out the meeting form and clicks submit
- Frontend triggers the
submit_meeting.ymlworkflow viaworkflow_dispatch - Frontend sends: OAuth code + meeting data
- GitHub Actions workflow:
- Exchanges OAuth code for access token (using client secret)
- Calls GitHub API to get the authenticated user's username
- Appends meeting record to
data/meetings.jsonwithsubmitted_byandtimestamp - Commits changes back to the repository
- User sees success message and can view the dashboard
- Client Secret: Never exposed to frontend, stays in GitHub Actions secrets
- Access Token: Never sent to frontend, used only server-side in workflow
- PAT: Fine-grained with minimal permissions (Actions:write only)
- Audit Trail: Every submission records which GitHub user submitted it
.
├── .github/
│ └── workflows/
│ └── submit_meeting.yml # Workflow to process submissions
├── data/
│ └── meetings.json # Meeting records storage
├── .gitignore # Keeps config.js private
├── config.example.js # Template for configuration
├── config.js # Your credentials (gitignored, not in repo)
├── index.html # Main submission form
├── app.js # Frontend JavaScript
├── dashboard.html # View all meetings
└── README.md # This file
- Visit
https://singularitynet-archive.github.io/Prototype-Meeting-Archives/ - Click "Login with GitHub" and authorize the app
- Fill out the meeting form:
- Title: Meeting name
- Date: Meeting date
- Participants: Who attended
- Topics: What was discussed
- Decisions: Key decisions made
- Actions: Follow-up action items
- Notes: Additional information
- Click "Submit Meeting Record"
- Wait for confirmation message
- Visit
https://singularitynet-archive.github.io/Prototype-Meeting-Archives/dashboard.html - Browse all submitted meetings
- Use the search box to filter by keywords
- Click "Refresh" to see new submissions
- ✅ Credentials never committed:
config.jsis gitignored and stays local - ✅ OAuth client secret is stored in GitHub Actions secrets (never in code)
- ✅ Access tokens never reach the frontend
- ✅ Classic PAT has minimal scope (public_repo for public repos)
- ✅ No secrets in repository: Safe to share publicly
- Local config.js: Each user needs their own
config.jsfile locally (never commit it!) - GitHub Pages deployment: For production, you'll need to handle config differently (see below)
- PAT Expiration: Remember to renew your PAT before it expires
- OAuth Code: Single-use only - frontend forces re-authentication after each submission
- Public Data: Meeting records in
data/meetings.jsonare public (visible to anyone)
This project includes a GitHub Actions deployment workflow (.github/workflows/deploy-pages.yml) that automatically:
- ✅ Generates
config.jsfrom repository secrets during deployment - ✅ Deploys to GitHub Pages on every push to main
- ✅ Keeps your credentials secure (never in repository, only in secrets)
How it works:
- You store
OAUTH_CLIENT_IDandWORKFLOW_PATas repository secrets - The deployment workflow reads these secrets and creates
config.jsduring build - GitHub Pages serves the site with the generated config file
- Your credentials never appear in the repository or git history
To deploy:
- Add secrets
OAUTH_CLIENT_ID(step 2) andWORKFLOW_PAT(step 5) - Enable GitHub Pages with source "GitHub Actions" (see step 6 in setup)
- Push to main branch - deployment happens automatically!
If you see "The config.js file is missing or not loaded" on the deployed site:
- Add deployment secrets: Go to Settings → Secrets → Actions and add:
OAUTH_CLIENT_ID(your OAuth App Client ID)WORKFLOW_PAT(your classic PAT)
- Enable GitHub Actions for Pages: Settings → Pages → Source: "GitHub Actions"
- Trigger deployment: Push to main branch or go to Actions tab and run "Deploy to GitHub Pages" manually
- Wait for deployment: Check the Actions tab to see deployment progress (takes 2-3 minutes)
- Check that
OAUTH_CLIENT_IDandOAUTH_CLIENT_SECRETare set correctly in repository secrets - Verify that the Client ID matches your OAuth App
- Ensure
.github/workflows/submit_meeting.ymlexists in your repository - Check that you've pushed the workflow file to the main branch
- Verify your GitHub PAT in
app.jsis valid and has the correct scope (public_repo or repo) - Check GitHub Actions tab for workflow run errors
- Ensure the workflow has
contents: writepermission
- Verify the redirect URI in your OAuth App settings matches exactly:
https://singularitynet-archive.github.io/Prototype-Meeting-Archives/ - Check that GitHub Pages is enabled and deployed
Each meeting record in data/meetings.json:
{
"title": "Weekly Team Sync",
"date": "2025-10-28",
"participants": "Alice, Bob, Carol",
"topics": "Project updates and roadmap discussion",
"decisions": "Approved new feature timeline",
"actions": "Alice to draft requirements, Bob to set up dev environment",
"notes": "Next meeting scheduled for next week",
"submitted_by": "alice-github",
"timestamp": "2025-10-28T14:30:00Z"
}This is a prototype system. Feel free to:
- Report issues
- Suggest improvements
- Submit pull requests
MIT License - feel free to use and modify as needed.
Built with ❤️ using GitHub Pages, GitHub Actions, and GitHub OAuth