{"id":27061507,"url":"https://github.com/morphclue/apollusia","last_synced_at":"2025-09-14T16:06:40.988Z","repository":{"id":56806088,"uuid":"479328942","full_name":"Morphclue/apollusia","owner":"Morphclue","description":"Calendar tool for coordinating meetings","archived":false,"fork":false,"pushed_at":"2025-08-18T00:59:33.000Z","size":5880,"stargazers_count":8,"open_issues_count":27,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-08-23T10:32:49.522Z","etag":null,"topics":["angular","hacktoberfest","nestjs","typescript"],"latest_commit_sha":null,"homepage":"http://apollusia.com","language":"TypeScript","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/Morphclue.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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,"zenodo":null}},"created_at":"2022-04-08T09:33:31.000Z","updated_at":"2025-07-29T16:55:36.000Z","dependencies_parsed_at":"2023-12-01T08:28:33.983Z","dependency_job_id":"083ed0df-33c2-4574-80a5-1041e8854b2d","html_url":"https://github.com/Morphclue/apollusia","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Morphclue/apollusia","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Morphclue%2Fapollusia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Morphclue%2Fapollusia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Morphclue%2Fapollusia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Morphclue%2Fapollusia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Morphclue","download_url":"https://codeload.github.com/Morphclue/apollusia/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Morphclue%2Fapollusia/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275128948,"owners_count":25410374,"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","status":"online","status_checked_at":"2025-09-14T02:00:10.474Z","response_time":75,"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":["angular","hacktoberfest","nestjs","typescript"],"created_at":"2025-04-05T14:26:12.811Z","updated_at":"2025-09-14T16:06:40.921Z","avatar_url":"https://github.com/Morphclue.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# \u003cimg src=\".github/images/logo.png\" alt=\"Apollusia Logo\" height=\"40\"\u003e Apollusia\n\nApollusia is a calendar tool for coordinating events with multiple people.\nIt is a web application written in Angular with NestJS as the backend.\nA running instance of the application can be found under https://apollusia.com/.\nFeel free to check it out!\n\n:star: Star this project on GitHub — it motivates me a lot!\n\n## Screenshots\n\n### View Your Polls and Participations in the Dashboard\n\n![Dashboard](.github/images/dashboard_light.png#gh-light-mode-only)\n![Dashboard](.github/images/dashboard_dark.png#gh-dark-mode-only)\n\n### Create Polls with Advanced Options\n\n![Create Polls](.github/images/new_poll_light.png#gh-light-mode-only)\n![Create Polls](.github/images/new_poll_dark.png#gh-dark-mode-only)\n\n### Choose Available Dates and Times\n\n![Choose Dates](.github/images/choose_events_light.png#gh-light-mode-only)\n![Choose Dates](.github/images/choose_events_dark.png#gh-dark-mode-only)\n\n### Participate and Find the Best Option\n\n![Participate](.github/images/participate_light.png#gh-light-mode-only)\n![Participate](.github/images/participate_dark.png#gh-dark-mode-only)\n\n## Features\n\nApollusia offers a variety of features to make event coordination as easy as possible.\nAll features are completely free and can be used without registration.\n\n\u003c!-- features:start --\u003e\n### Participation\n\n\u003cdl\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/incognito.svg\" alt=\"incognito\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eAnonymous participation\u003c/dt\u003e\n  \u003cdd\u003eParticipants can vote without entering their name\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/pencil-square.svg\" alt=\"pencil-square\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eEditing participation\u003c/dt\u003e\n  \u003cdd\u003eParticipants can edit their participation\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/eye-slash.svg\" alt=\"eye-slash\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eBlind participation\u003c/dt\u003e\n  \u003cdd\u003eParticipants can't see other participants until they participate\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/chat-dots.svg\" alt=\"chat-dots\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eComments\u003c/dt\u003e\n  \u003cdd\u003eAdd comments to a poll\u003c/dd\u003e\n\u003c/dl\u003e\n\n### Poll Options\n\n\u003cdl\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/1-square.svg\" alt=\"1-square\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eParticipation limit\u003c/dt\u003e\n  \u003cdd\u003eLimit the number of participants\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/question-square.svg\" alt=\"question-square\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eMaybe Option\u003c/dt\u003e\n  \u003cdd\u003eFriendlier event selection with a Maybe option\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/calendar-day.svg\" alt=\"calendar-day\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eDeadline\u003c/dt\u003e\n  \u003cdd\u003eSet a deadline for new participations\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/markdown.svg\" alt=\"markdown\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eRich Text and Links in Description\u003c/dt\u003e\n  \u003cdd\u003eAdd Markdown formatted text and links to the description\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/calendar-week.svg\" alt=\"calendar-week\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eEvents of varying length\u003c/dt\u003e\n  \u003cdd\u003eEvery event can have its own length\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/sticky.svg\" alt=\"sticky\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eEvent Notes\u003c/dt\u003e\n  \u003cdd\u003eAdd notes to events to provide additional information\u003c/dd\u003e\n\u003c/dl\u003e\n\n### Productivity\n\n\u003cdl\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/calendar-range.svg\" alt=\"calendar-range\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eAutofill\u003c/dt\u003e\n  \u003cdd\u003eCreate many sequential events automatically, with breaks and on multiple days\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/copy.svg\" alt=\"copy\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eCloning polls\u003c/dt\u003e\n  \u003cdd\u003eClone polls to start off with the same options\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/fast-forward.svg\" alt=\"fast-forward\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003ePostponing events\u003c/dt\u003e\n  \u003cdd\u003eMove all events to a later date\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/calendar2-week.svg\" alt=\"calendar2-week\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eiCal Export\u003c/dt\u003e\n  \u003cdd\u003eKeep track of your polled events and 1-1 meetings using your favorite calendar app\u003c/dd\u003e\n\u003c/dl\u003e\n\n### Poll Management\n\n\u003cdl\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/send.svg\" alt=\"send\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eInvite Participants\u003c/dt\u003e\n  \u003cdd\u003eInvite participants via email or other means\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/bell.svg\" alt=\"bell\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eNotifications\u003c/dt\u003e\n  \u003cdd\u003eReceive quick updates to polls and participations via Push Notifications on all your devices\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/envelope.svg\" alt=\"envelope\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eEmail Updates\u003c/dt\u003e\n  \u003cdd\u003eReceive detailed updates to polls and participations via Email\u003c/dd\u003e\n  \u003cimg src=\"docs/bootstrap-icons/icons/clock-history.svg\" alt=\"clock-history\" align=\"right\" height=\"50\"\u003e\n  \u003cdt\u003eHistory\u003c/dt\u003e\n  \u003cdd\u003eSee all changes to a poll\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003c!-- features:end --\u003e\n\n## Setup\n\nCreate an `.env` file in the backend directory and add the following environment variables:\n\n```properties\nVAPID_PUBLIC_KEY=\u003cvapid public key\u003e # for push notifications\nVAPID_PRIVATE_KEY=\u003cvapid private key\u003e # for push notifications\nKEYCLOAK_CLIENT_SECRET=\u003ckeycloak client secret\u003e\nAUTH_PUBLIC_KEY=\u003ckeycloak public key\u003e\nCONTACT_OPERATOR=\u003ccontact operator\u003e\nCONTACT_MAIL=\u003ccontact email\u003e\nCONTACT_ADDRESS=\u003ccontact address\u003e\n```\n\nVAPID keys can be generated using the following command:\n\n```bash\nnpx web-push generate-vapid-keys\n```\n\nTo set up Keycloak, follow these steps\n- Run it with `docker compose up -d keycloak`\n- Go to `http://localhost:8080/auth`.\n- Create a new realm called `apollusia`\n- Create a client called `web` with the following options:\n  - Valid Redirect URLs: `http://localhost:4200/*`\n  - Valid Post Logout Redirect URLs: `+`\n  - Web Origins: `+`.\n- Under \"Realm Settings \u003e Login\", configure:\n  - User registration: On\n  - Forgot password: On\n  - Remember me: On\n  - Email as username: On\n  - Login with email: On\n  - Duplicate emails: Off\n  - Verify email: Off\n- Under \"Realm Settings \u003e User profile\", create these attributes:\n  1. - Attribute [Name]: pushTokens\n     - Display Name: Push Tokens\n     - Multivalued: On\n     - Attribute Group: user-metadata\n     - Who can edit?: User, Admin\n     - Who can view?: User, Admin\n  2. - Attribute [Name]: notifications\n     - Display Name: Notifications\n     - Multivalued: On\n     - Attribute Group: user-metadata\n     - Who can edit?: User, Admin\n     - Who can view?: User, Admin\n- Create a user as follows:\n  - Email Verified: Yes\n  - Username/email: admin@apollusia.com\n  - First Name: Apollusia\n  - Last Name: Admin\n  - Hit Create\n  - Credentials \u003e Set Password: `root` \n  - Role Mapping \u003e Assign Role \u003e Filter by clients \u003e Select all (the list may be long, change pagination to 100 elements to see all) \u003e Assign\n  - Role Mapping \u003e Assign Role \u003e Filter by realm roles \u003e Select all \u003e Assign\n\nYou can get the Keycloak Client Secret like this:\n- Go to http://localhost:8080/auth/admin/master/console/#/apollusia/clients\n- Select admin-cli\n- Under Settings, make sure Client authentication is enabled\n- Hit Save\n- Go to the Credentials tab and copy the Client Secret\n\nTo get the Keycloak public key, follow these steps:\n- Go to http://localhost:8080/auth/admin/master/console/#/apollusia/realm-settings/keys\n- Click on the RS256 Public Key\n- Copy the base64 key\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorphclue%2Fapollusia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmorphclue%2Fapollusia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorphclue%2Fapollusia/lists"}