{"id":50294725,"url":"https://github.com/chrisrobison/ambassadors","last_synced_at":"2026-05-28T08:03:59.908Z","repository":{"id":281719136,"uuid":"945776233","full_name":"chrisrobison/ambassadors","owner":"chrisrobison","description":"A quick \u0026 simple event manager using Airtables as the data store and plain html + vanilla JS for the client","archived":false,"fork":false,"pushed_at":"2025-03-10T19:08:39.000Z","size":353,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-10T20:23:45.171Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chrisrobison.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-10T05:28:39.000Z","updated_at":"2025-03-10T19:08:43.000Z","dependencies_parsed_at":"2025-03-10T20:23:47.397Z","dependency_job_id":"7d7cdc77-20ef-4559-967f-88c023d18388","html_url":"https://github.com/chrisrobison/ambassadors","commit_stats":null,"previous_names":["chrisrobison/ambassadors"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/chrisrobison/ambassadors","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisrobison%2Fambassadors","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisrobison%2Fambassadors/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisrobison%2Fambassadors/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisrobison%2Fambassadors/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chrisrobison","download_url":"https://codeload.github.com/chrisrobison/ambassadors/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisrobison%2Fambassadors/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33599494,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-28T08:03:58.675Z","updated_at":"2026-05-28T08:03:59.901Z","avatar_url":"https://github.com/chrisrobison.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Admin Portal with Secure Airtable Proxy\n\nA comprehensive admin portal for managing events and announcements with a secure Node.js proxy server for Airtable API integration.\n\n## 📋 Overview\n\nThis project provides a complete solution for organizations to manage and display events and announcements. It consists of a public-facing page for visitors and a secure admin portal for content management. All Airtable API interactions are handled through a secure proxy server to protect API credentials.\n\n![Admin Portal Screenshot](https://via.placeholder.com/800x450?text=Admin+Portal+Screenshot)\n\n## ✨ Features\n\n- **Secure Airtable Integration**: Node.js proxy server keeps API credentials secure\n- **Dashboard**: At-a-glance statistics and recent activity tracking\n- **Event Management**: Create, edit, and delete events with detailed information\n- **Announcement System**: Manage public announcements with draft/published status\n- **Responsive Design**: Fully responsive interface works on desktop and mobile\n- **Security**: API rate limiting, error handling, and credential protection\n\n## 🛠️ Tech Stack\n\n- **Frontend**: HTML, CSS, JavaScript (Vanilla)\n- **Backend**: Node.js, Express\n- **Database**: Airtable\n- **Security**: dotenv, express-rate-limit\n- **API Communication**: Axios\n\n## 🚀 Getting Started\n\n### Prerequisites\n\n- Node.js v14 or higher\n- npm (Node Package Manager)\n- Airtable account with appropriate base configuration\n- Personal Access Token (PAT) for Airtable API access\n\n### Installation\n\n1. Clone the repository:\n   ```bash\n   git clone https://github.com/yourusername/admin-portal.git\n   cd admin-portal\n   ```\n\n2. Install dependencies:\n   ```bash\n   npm install\n   ```\n\n3. Create a `.env` file in the root directory with your Airtable credentials:\n   ```\n   AIRTABLE_PERSONAL_ACCESS_TOKEN=your_personal_access_token\n   AIRTABLE_BASE_ID=your_base_id\n   PORT=2415\n   ```\n\n4. Start the server:\n   ```bash\n   npm start\n   ```\n\n5. Access the application:\n   - Public page: `http://localhost:2415/`\n   - Admin portal: `http://localhost:2415/portal`\n\n### Airtable Base Structure\n\nThis application requires the following Airtable base structure:\n\n**Events Table:**\n- Event Name (Text)\n- Date and Time (DateTime)\n- Description (Long Text)\n- Chapter (Link to Chapters table)\n- Attendance (Number)\n- Group Photo (Attachment)\n- All Photos (URL)\n- Email List (URL)\n\n**Announcements Table:**\n- Title (Text)\n- Content (Long Text)\n- Status (Single Select: \"Draft\" or \"Published\")\n- Image (URL)\n- Chapters (Link to Chapters table)\n- People (Link to People table)\n\n## 🔒 Security Features\n\n- **Credential Protection**: Airtable API credentials stored server-side\n- **Rate Limiting**: Prevents API abuse (100 requests per 15 minutes per IP)\n- **Error Sanitization**: Prevents exposure of sensitive information in errors\n- **CORS Configuration**: Configurable access control for API endpoints\n\n## 🌐 API Endpoints\n\nThe proxy server provides these endpoints:\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| GET | `/api/:table` | Get all records from a table |\n| GET | `/api/:table/:id` | Get a specific record |\n| POST | `/api/:table` | Create new record(s) |\n| PATCH | `/api/:table` | Update record(s) |\n| DELETE | `/api/:table/:id` | Delete a record |\n\n## 🔧 Configuration Options\n\n### Environment Variables\n\n- `AIRTABLE_PERSONAL_ACCESS_TOKEN`: Your Airtable Personal Access Token\n- `AIRTABLE_BASE_ID`: Your Airtable Base ID\n- `PORT`: Server port (default: 2415)\n- `NODE_ENV`: Set to \"production\" for production mode\n\n### Customizing the UI\n\nThe admin portal UI can be customized by modifying CSS variables:\n\n```css\n:root {\n    --primary-yellow: #ffdd00;\n    --dark-text: #1a1a1a;\n    /* other variables */\n}\n```\n\n## 🚢 Deployment\n\n### For Production\n\n1. Set up your server environment (Node.js v14+)\n2. Clone the repository\n3. Install dependencies: `npm install --production`\n4. Set up environment variables securely\n5. Start with a process manager: `pm2 start server.js --name admin-portal`\n6. Configure a reverse proxy (Nginx/Apache) with HTTPS\n\n### Security Recommendations\n\n1. Always use HTTPS in production\n2. Implement authentication for the admin portal\n3. Restrict CORS to your specific domains\n4. Regularly update dependencies\n5. Set up proper logging\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 👏 Acknowledgements\n\n- [Airtable](https://airtable.com/) for the flexible database\n- [Express](https://expressjs.com/) for the server framework\n- [Axios](https://axios-http.com/) for HTTP requests\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrisrobison%2Fambassadors","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchrisrobison%2Fambassadors","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrisrobison%2Fambassadors/lists"}