{"id":15132846,"url":"https://github.com/davidbates/available","last_synced_at":"2026-01-19T07:32:24.390Z","repository":{"id":252569336,"uuid":"840817787","full_name":"DavidBates/Available","owner":"DavidBates","description":"Available: A humorous meeting indicator for Raspberry Pi ","archived":false,"fork":false,"pushed_at":"2024-08-10T19:23:54.000Z","size":43,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-05T21:45:07.257Z","etag":null,"topics":["gifs","giphy-api","kiosk-mode","meeting","raspberry-pi","react","vite"],"latest_commit_sha":null,"homepage":"https://github.com/DavidBates/Available","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DavidBates.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2024-08-10T19:19:29.000Z","updated_at":"2024-08-10T19:23:56.000Z","dependencies_parsed_at":"2024-08-10T20:56:56.065Z","dependency_job_id":null,"html_url":"https://github.com/DavidBates/Available","commit_stats":null,"previous_names":["davidbates/available"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DavidBates%2FAvailable","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DavidBates%2FAvailable/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DavidBates%2FAvailable/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DavidBates%2FAvailable/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DavidBates","download_url":"https://codeload.github.com/DavidBates/Available/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247406070,"owners_count":20933802,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["gifs","giphy-api","kiosk-mode","meeting","raspberry-pi","react","vite"],"created_at":"2024-09-26T04:40:43.433Z","updated_at":"2026-01-19T07:32:24.383Z","avatar_url":"https://github.com/DavidBates.png","language":"JavaScript","readme":"\n# Available - A React Kiosk App with Google Calendar and Giphy Integration\n\nAvailable is a React-based web application designed to run in kiosk mode on a Raspberry Pi. It displays whether you are currently in a meeting or available by fetching data from your Google Calendar and displaying relevant GIFs using the Giphy API.\n\n## Table of Contents\n\n- [Features](#features)\n- [Prerequisites](#prerequisites)\n- [Getting Started](#getting-started)\n  - [Clone the Repository](#clone-the-repository)\n  - [Get Google Auth Key](#get-google-auth-key)\n  - [Get Giphy API Key](#get-giphy-api-key)\n  - [Set Up Environment Variables](#set-up-environment-variables)\n- [Running the Project](#running-the-project)\n  - [Using Dev Container](#using-dev-container)\n  - [Running Locally](#running-locally)\n- [Deploying on Raspberry Pi](#deploying-on-raspberry-pi)\n  - [Running in Kiosk Mode](#running-in-kiosk-mode)\n- [License](#license)\n\n## Features\n\n- **Google Calendar Integration**: Checks your Google Calendar for upcoming events and determines your availability.\n- **Giphy Integration**: Displays GIFs from Giphy based on your availability status.\n- **Kiosk Mode**: Designed to run full-screen on a Raspberry Pi in kiosk mode.\n\n## Prerequisites\n\n- Node.js and npm\n- Google Account for Calendar API\n- Giphy Account for API access\n- Docker and VS Code (for using the development container)\n\n## Getting Started\n\n### Clone the Repository\n\n```bash\ngit clone https://github.com/your-username/available.git\ncd available\n```\n\n### Get Google Auth Key\n\n1. Go to the [Google Cloud Console](https://console.cloud.google.com/).\n2. Create a new project.\n3. Enable the **Google Calendar API** for your project.\n4. Go to the **Credentials** section.\n5. Create **OAuth 2.0 Client IDs** credentials:\n   - Application type: **Web application**\n   - Authorized redirect URIs: `http://localhost`\n6. Download the credentials JSON file and extract your **Client ID**.\n\n### Get Giphy API Key\n\n1. Sign up or log in to [Giphy Developers](https://developers.giphy.com/).\n2. Create a new app.\n3. Copy the **API Key** provided by Giphy.\n\n### Set Up Environment Variables\n\nCreate a `.env` file in the root of the project with the following content:\n\n```env\nVITE_GOOGLE_CLIENT_ID=your-google-client-id-here\nVITE_GIPHY_API_KEY=your-giphy-api-key-here\n```\n\nReplace `your-google-client-id-here` and `your-giphy-api-key-here` with the actual keys obtained from Google and Giphy.\n\n## Running the Project\n\n### Using Dev Container\n\nThis project is configured to use a development container for a consistent development environment.\n\n1. **Open the project in VS Code**.\n2. **Reopen the project in a Dev Container**:\n   - Press `F1`, type \"Remote-Containers: Reopen in Container\" and select it.\n3. **The container will automatically build and start**, installing all dependencies.\n\n### Running Locally\n\nIf you prefer running the project locally:\n\n1. **Install dependencies**:\n\n    ```bash\n    npm install\n    ```\n\n2. **Run the project**:\n\n    ```bash\n    npm run dev\n    ```\n\n3. **Open your browser** and navigate to `http://localhost:5147` to see the app in action.\n\n## Deploying on Raspberry Pi\n\n### Running in Kiosk Mode\n\n1. **Build the project**:\n\n    ```bash\n    npm run build\n    ```\n\n2. **Serve the app using pm2**:\n\n    ```bash\n    sudo npm install -g pm2\n    pm2 serve dist 5000 --name \"available\"\n    pm2 startup\n    pm2 save\n    ```\n\n3. **Set up Chromium in kiosk mode**:\n   - Edit the autostart file:\n\n     ```bash\n     sudo nano /etc/xdg/lxsession/LXDE-pi/autostart\n     ```\n\n   - Add the following lines:\n\n     ```bash\n     @xset s off\n     @xset -dpms\n     @xset s noblank\n     @chromium-browser --noerrdialogs --disable-infobars --kiosk http://localhost:5000\n     ```\n\n4. **Reboot the Raspberry Pi**:\n\n    ```bash\n    sudo reboot\n    ```\n\n5. Your app should now automatically start in kiosk mode on boot.\n\n## License\n\n\u003cp xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dct=\"http://purl.org/dc/terms/\"\u003e\u003ca property=\"dct:title\" rel=\"cc:attributionURL\" href=\"https://github.com/DavidBates/available\"\u003eAvailable\u003c/a\u003e by \u003ca rel=\"cc:attributionURL dct:creator\" property=\"cc:attributionName\" href=\"https://github.com/DavidBates\"\u003eDavid Bates\u003c/a\u003e is licensed under \u003ca href=\"https://creativecommons.org/licenses/by/4.0/?ref=chooser-v1\" target=\"_blank\" rel=\"license noopener noreferrer\" style=\"display:inline-block;\"\u003eCC BY 4.0\u003cimg style=\"height:22px!important;margin-left:3px;vertical-align:text-bottom;\" src=\"https://mirrors.creativecommons.org/presskit/icons/cc.svg?ref=chooser-v1\" alt=\"\"\u003e\u003cimg style=\"height:22px!important;margin-left:3px;vertical-align:text-bottom;\" src=\"https://mirrors.creativecommons.org/presskit/icons/by.svg?ref=chooser-v1\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidbates%2Favailable","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdavidbates%2Favailable","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidbates%2Favailable/lists"}