{"id":21487173,"url":"https://github.com/dtinth/auden","last_synced_at":"2025-07-15T15:30:44.554Z","repository":{"id":40709901,"uuid":"170817878","full_name":"dtinth/auden","owner":"dtinth","description":"Audience engagement platform","archived":false,"fork":false,"pushed_at":"2024-05-17T15:15:45.000Z","size":1916,"stargazers_count":27,"open_issues_count":16,"forks_count":9,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-05-17T16:32:02.782Z","etag":null,"topics":["audience-engagement","events","firebase","interactive","poll","questions-and-answers","quiz","react","typescript"],"latest_commit_sha":null,"homepage":"https://dt.in.th/auden.html","language":"TypeScript","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/dtinth.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":"2019-02-15T07:07:15.000Z","updated_at":"2024-05-17T16:32:04.448Z","dependencies_parsed_at":"2024-05-17T16:42:08.660Z","dependency_job_id":null,"html_url":"https://github.com/dtinth/auden","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtinth%2Fauden","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtinth%2Fauden/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtinth%2Fauden/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtinth%2Fauden/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dtinth","download_url":"https://codeload.github.com/dtinth/auden/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":226047678,"owners_count":17565384,"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":["audience-engagement","events","firebase","interactive","poll","questions-and-answers","quiz","react","typescript"],"created_at":"2024-11-23T13:27:06.760Z","updated_at":"2024-11-23T13:27:07.224Z","avatar_url":"https://github.com/dtinth.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# auden\n\n**auden** is an **open-source, hackable audience engagement software**,\nsupporting multiple features, such as **Live quiz** and **Voting system**. Its\nhackable architecture allows developer to modify and add features to fit the\nevent.\n\nWe used **auden** in _[Code in the Dark](http://codeinthedark.com/) Thailand #3:\nCNX 2019_ to encourage attendees to participate in the event more easily.\n\nInstead of requiring all contestants to register beforehand (which takes quite a\ncourage), a **live quiz** system allows anyone in the event to compete to become\na contestant in each round.\n\n![Photo](docs/images/use-case-quiz.jpg)\n\nBecause this app supports multiple features, when it’s time for voting,\nattendees can vote on the same webpage without the need to switch between\nmultiple apps (such as Mentimeter, Slido, and Kahoot).\n\n![Photo](docs/images/use-case-vote.jpg)\n\n## Feature tour\n\nEach feature (called **scene**) contains 3 user-facing\n[components](https://reactjs.org/docs/components-and-props.html):\n\n- The **Audience** component is a mobile UI for audience to engage in the event.\n- The **Presentation** component displays what the audience will see on the big\n  screen.\n- The **Backstage** component allows event staff to manipulate the scene (such\n  as activating a question, displaying scoreboard, etc.)\n\n### `quiz`\n\nPlay a multiple-choice quiz game with any number of participants, similar to\nKahoot.\n\n![Photo](docs/images/example-quiz.png)\n\n### `vote`\n\nCreate a live poll to gather audience’s opinion, similar to Mentimeter.\n\n![Photo](docs/images/example-vote.png)\n\n## Technical\n\nIt is a webapp, built on top of:\n\n- React!\n- TypeScript!\n- Grommet!\n- Firebase Real-time Database!\n- fiery :fire:!\n- Hooks and Suspense!\n\n## Set up Firebase project\n\n1. **Set up Firebase Authentication** to allow sign in using Facebook.\n\n2. **Sign in** using the web app, and obtain the Firebase user ID by running\n   `firebase.auth().currentUser.uid` in the JavaScript console.\n\n3. **Make the user an admin** by writing `true` Firebase Database at\n   `/admins/$uid`. Admin users can read and write anything.\n\n## Data model\n\n### Scene\n\nEverything is organized into “scenes,” which represents a type of situation in\nan event.\n\nFor example, you can have a scene for a quiz, for a survey, for voting, for\nannouncements, and an idle scene when there’s nothing interesting going on.\n\nEach scene has:\n\n- A presentation display, for projecting to a large screen.\n- A audience UI to let audience engage with the event from their mobile phone\n  (or desktop).\n- A backstage UI to manipulate the scene.\n\nData is structured in Firebase this way: **Namespace \u0026rarr; Name \u0026rarr; Access\npattern**. This allows using same Firebase rules across all scene types,\neliminating need for us to deploy new rules when adding new scene types.\n\nAvailable access patterns:\n\n- `public-read` — Anyone can read but only admins can write. Examples:\n  - `main` \u0026rarr; `state` \u0026rarr; `public-read` \u0026rarr; `showLeaderboard`\n  - `main` \u0026rarr; `settings` \u0026rarr; `public-read` \u0026rarr; `maxVotes`\n- `personal` — Anyone can read, however, each user can write to their own\n  personal slot. Examples:\n  - `main` \u0026rarr; `poll` \u0026rarr; `personal` \u0026rarr; `$uid` \u0026rarr; `selectedOption`\n- `events` — Anyone can read. Each user can publish events. Append-only.\n  Examples:\n  - `main` \u0026rarr; `chatMessages` \u0026rarr; `events` \u0026rarr; `$eventId`\n- `private` — Each user can read and write to their own personal slot. Examples:\n  - `answers` \u0026rarr; `$questionId` \u0026rarr; `private` \u0026rarr; `$uid` \u0026rarr;\n    `answerId`\n- `inbox` — Each user can read data assigned to their own personal slot.\n  Examples:\n  - `main` \u0026rarr; `role` \u0026rarr; `inbox` \u0026rarr; `$uid`\n- `secret` — Only admin can access\n  - `main` \u0026rarr; `questions` \u0026rarr; `secret`\n\n### Screen\n\nAn instance of a scene. It has:\n\n- Data stored in Firebase. How data is used is determined by scene type.\n\nThat can be one active screen at a given time.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdtinth%2Fauden","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdtinth%2Fauden","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdtinth%2Fauden/lists"}