{"id":22395657,"url":"https://github.com/zoonk/uneebee","last_synced_at":"2025-10-17T04:31:20.362Z","repository":{"id":193813467,"uuid":"689542025","full_name":"zoonk/uneebee","owner":"zoonk","description":"Platform for creating interactive courses.","archived":false,"fork":false,"pushed_at":"2025-01-02T16:22:09.000Z","size":4958,"stargazers_count":1335,"open_issues_count":42,"forks_count":79,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-01-26T08:01:43.229Z","etag":null,"topics":["education","elixir","flyio","phoenix","phoenix-liveview","postgres","resend-email","tailwindcss"],"latest_commit_sha":null,"homepage":"https://zoonk.org","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zoonk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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},"funding":{"github":"wceolin"}},"created_at":"2023-09-10T06:17:15.000Z","updated_at":"2025-01-25T13:57:03.000Z","dependencies_parsed_at":"2023-10-15T22:44:40.067Z","dependency_job_id":"8deadc70-4efa-4d46-9916-5c33aa973bdb","html_url":"https://github.com/zoonk/uneebee","commit_stats":null,"previous_names":["zoonk/uneebee","zoonk/zoonk","zoonk/archived-zoonk"],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoonk%2Funeebee","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoonk%2Funeebee/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoonk%2Funeebee/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoonk%2Funeebee/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zoonk","download_url":"https://codeload.github.com/zoonk/uneebee/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":236766972,"owners_count":19201440,"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":["education","elixir","flyio","phoenix","phoenix-liveview","postgres","resend-email","tailwindcss"],"created_at":"2024-12-05T06:01:45.998Z","updated_at":"2025-10-17T04:31:14.980Z","avatar_url":"https://github.com/zoonk.png","language":"Elixir","readme":"\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/zoonk/.github/assets/4393133/3a24c5e9-dc8e-4491-9aeb-95dd6f7283c8\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/zoonk/.github/assets/4393133/ddbb2208-feac-4a58-adac-f769cff4dc7f\"\u003e\n  \u003cimg alt=\"Zoonk Banner\" src=\"https://github.com/zoonk/.github/assets/4393133/ddbb2208-feac-4a58-adac-f769cff4dc7f\"\u003e\n\u003c/picture\u003e\n\n\u003e [!CAUTION]\n\u003e ## Project No Longer Maintained\n\u003e\n\u003e Uneebee is no longer being maintained. I’m building a new platform, [Zoonk](https://github.com/zoonk/zoonk), with a different focus. Instead of continuing Uneebee, I’m restructuring everything from the ground up to create a better way to learn through interactive courses.\n\u003e\n\u003e The new project will initially use LLMs for learning and later expand to allow course creation, similar to Uneebee but with a more refined approach.\n\u003e\n\u003e If you liked Uneebee, feel free to fork it. To follow the progress of Zoonk, [check out the new repo](https://github.com/zoonk/zoonk).\n\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n  Open-source alternative to create interactive courses like Duolingo.\n  \u003cbr /\u003e\n  \u003ca href=\"https://zoonk.org\"\u003e\u003cstrong\u003eLearn more »\u003c/strong\u003e\u003c/a\u003e\n  \u003cbr /\u003e\n  \u003cbr /\u003e\n  \u003ca href=\"https://github.com/zoonk/.github/blob/main/roadmap.md\"\u003eRoadmap\u003c/a\u003e\n  ·\n  \u003ca href=\"https://github.com/orgs/zoonk/discussions\"\u003eCommunity\u003c/a\u003e\n\u003c/p\u003e\n\n## Table of Contents\n\n- [About this project](#about-this-project)\n- [Tech stack](#tech-stack)\n- [Getting started](#getting-started)\n  - [Requirements](#requirements)\n  - [Local development](#local-development)\n- [SSL on localhost](#ssl-on-localhost)\n- [Mailer](#mailer)\n- [Storage](#storage)\n- [Sponsors](#sponsors)\n\n## About this project\n\nInteractive learning is [more effective](https://www.sciencedaily.com/releases/2021/09/210930140710.htm) than traditional methods. [Learners remember](https://www.linkedin.com/pulse/how-does-interactive-learning-boost-outcomes/) 10% of what they hear, 20% of what they read but 80% of what they see and do. That's why 34 hours of Duolingo [are equivalent](https://support.duolingo.com/hc/en-us/articles/115000035183-Are-there-official-studies-about-Duolingo-) to a full university semester of language education.\n\nWe love Duolingo. We think those kinds of interactive experiences should be used in more fields. That's why we're building Zoonk, an open-source platform to create interactive courses like Duolingo.\n\n## Tech stack\n\n- **Backend**: [Phoenix](https://www.phoenixframework.org/)\n- **Frontend**: [Phoenix LiveView](https://hexdocs.pm/phoenix_live_view)\n- **Database**: [Postgres](https://www.postgresql.org) - [Neon](https://neon.tech/)\n- **CSS**: [Tailwind CSS](https://tailwindcss.com/)\n- **Email**: [Resend](https://resend.com/)\n- **Storage**: [Tigris](https://tigrisdata.com/)\n- **Hosting**: [Fly](https://fly.io/)\n\n## Getting started\n\nFollow the instructions below to get Zoonk up and running on your local machine. We have a `Dockerfile` for deploying our demo app to [Fly](https://fly.io/). For using Docker locally, [see this](./local/README.md).\n\n### Requirements\n\n- **Elixir 1.17+** and **Erlang 26+**. Run `elixir -v` to find your current version for [Elixir](https://elixir-lang.org/install.html) and [Erlang](https://elixir-lang.org/install.html#installing-erlang).\n- **Hex**: `mix local.hex`.\n- **Phoenix**: `mix archive.install hex phx_new`.\n- **PostgreSQL 15+**: [PostgreSQL](https://www.postgresql.org/).\n- (Linux users only): [inotify-tools](https://github.com/inotify-tools/inotify-tools/wiki).\n\n### Local development\n\n- Run `mix setup` to install dependencies and set up the database and assets.\n- Run `mix seed` to fetch initial data to the database ([See options](./priv/repo/seed/README.md)).\n- Run `mix phx.server` to start a development server.\n- Run `mix test` to run tests or `mix test.watch` to run tests and watch for changes.\n- Run `mix ci` to run code quality checks.\n- Run `mix locale` to update translation files.\n\n## SSL on localhost\n\nPrefer to do local development using SSL to resemble production as much as possible. You can use [mkcert](https://github.com/FiloSottile/mkcert) to generate a certificate. After you install `mkcert`, follow the steps below:\n\n- Create a `cert` directory under `priv`: `mkdir priv/cert`.\n- Generate a new certificate: `mkcert -key-file priv/cert/selfsigned_key.pem -cert-file priv/cert/selfsigned.pem localhost zoonk.test \"*.zoonk.test\" apple.test`.\n- Run `mkcert -install` to install the certificate in the system trust store.\n- You may also need to enable `Allow invalid certificates for resources loaded from localhost` on [Google Chrome flags](chrome://flags/#allow-insecure-localhost).\n- Restart your local server: `mix phx.server`. You may also need to restart your browser.\n\nYou also need to make sure your machine maps `localhost` to a test domain (we're using `zoonk.test` for this guide). `dnsmasq` allows you to resolve domains to your local machine without having to change your `/etc/hosts` file. To install `dnsmasq`:\n\n```sh\nbrew install dnsmasq\n\n# Create a configuration directory\nmkdir -pv $(brew --prefix)/etc/\n\n# Set up your domains\necho 'address=/zoonk.test/127.0.0.1' \u003e\u003e $(brew --prefix)/etc/dnsmasq.conf\necho 'address=/.zoonk.test/127.0.0.1' \u003e\u003e $(brew --prefix)/etc/dnsmasq.conf\necho 'address=/apple.test/127.0.0.1' \u003e\u003e $(brew --prefix)/etc/dnsmasq.conf\n\n# Add dnsmasq to your resolver\nsudo mkdir -v /etc/resolver\nsudo bash -c 'echo \"nameserver 127.0.0.1\" \u003e /etc/resolver/zoonk.test'\nsudo bash -c 'echo \"nameserver 127.0.0.1\" \u003e /etc/resolver/apple.test'\n\n# Start dnsmasq\nsudo brew services start dnsmasq\n```\n\nThat's it! You can now start your local server (`mix phx.server`) and test your domains using:\n\n- https://zoonk.test:4001\n- https://apple.zoonk.test:4001 (each school slug can be used as a subdomain of `zoonk.test`).\n- Or any other domain you added before.\n\n## Mailer\n\nWe're using [Resend](https://resend.com) to send emails. To make it work in production, you need to set the following environment variables on your server:\n\n- `RESEND_API_KEY`: Your Resend API key.\n\n## Storage\n\nYou need to use an S3-compatible storage service to store your files. At Zoonk, we're using [Tigris](https://tigrisdata.com/). You need to add the following environment variables:\n\n- `AWS_ACCESS_KEY_ID`: Your AWS access key ID.\n- `AWS_SECRET_ACCESS_KEY`: Your AWS secret access key.\n- `AWS_REGION`: Your AWS region.\n- `BUCKET_NAME`: Your AWS bucket name.\n- `AWS_ENDPOINT_URL_S3`: Your AWS endpoint URL.\n- `AWS_CDN_URL`: Your AWS CDN URL (optional. If missing, we'll use the S3 endpoint URL).\n- `CSP_CONNECT_SRC`: Your S3 domain (i.e. `https://fly.storage.tigris.dev`).\n\n## Translations\n\nFollow the steps below to add a new language to Zoonk:\n\n1. Copy the `priv/gettext/en` directory to `priv/gettext/\u003clanguage_code\u003e`.\n2. Translate the `*.po` files.\n3. Add the language code to the `locales` list in [config/config.exs](config/config.exs).\n4. Add the language name to `@supported_locales` in [lib/translate/translate_plug.ex](lib/translate/translate_plug.ex).\n\n## Sponsors\n\n- [Gustavo A. Castillo](https://github.com/guscastilloa)\n- [@adriy-be](https://github.com/adriy-be)\n- Add your name or brand here by [sponsoring our project](https://github.com/sponsors/wceolin).\n","funding_links":["https://github.com/sponsors/wceolin"],"categories":["Elixir","[🔤 pedagogy](https://github.com/stars/ketsapiwiq/lists/pedagogy)"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoonk%2Funeebee","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzoonk%2Funeebee","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoonk%2Funeebee/lists"}