Caution
Uneebee is no longer being maintained. I’m building a new platform, 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.
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.
If you liked Uneebee, feel free to fork it. To follow the progress of Zoonk, check out the new repo.
Open-source alternative to create interactive courses like Duolingo.
Learn more »
Roadmap
·
Community
Interactive learning is more effective than traditional methods. Learners remember 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 to a full university semester of language education.
We 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.
- Backend: Phoenix
- Frontend: Phoenix LiveView
- Database: Postgres - Neon
- CSS: Tailwind CSS
- Email: Resend
- Storage: Tigris
- Hosting: Fly
Follow the instructions below to get Zoonk up and running on your local machine. We have a Dockerfile
for deploying our demo app to Fly. For using Docker locally, see this.
- Elixir 1.17+ and Erlang 26+. Run
elixir -v
to find your current version for Elixir and Erlang. - Hex:
mix local.hex
. - Phoenix:
mix archive.install hex phx_new
. - PostgreSQL 15+: PostgreSQL.
- (Linux users only): inotify-tools.
- Run
mix setup
to install dependencies and set up the database and assets. - Run
mix seed
to fetch initial data to the database (See options). - Run
mix phx.server
to start a development server. - Run
mix test
to run tests ormix test.watch
to run tests and watch for changes. - Run
mix ci
to run code quality checks. - Run
mix locale
to update translation files.
Prefer to do local development using SSL to resemble production as much as possible. You can use mkcert to generate a certificate. After you install mkcert
, follow the steps below:
- Create a
cert
directory underpriv
:mkdir priv/cert
. - 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
. - Run
mkcert -install
to install the certificate in the system trust store. - You may also need to enable
Allow invalid certificates for resources loaded from localhost
on Google Chrome flags. - Restart your local server:
mix phx.server
. You may also need to restart your browser.
You 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
:
brew install dnsmasq
# Create a configuration directory
mkdir -pv $(brew --prefix)/etc/
# Set up your domains
echo 'address=/zoonk.test/127.0.0.1' >> $(brew --prefix)/etc/dnsmasq.conf
echo 'address=/.zoonk.test/127.0.0.1' >> $(brew --prefix)/etc/dnsmasq.conf
echo 'address=/apple.test/127.0.0.1' >> $(brew --prefix)/etc/dnsmasq.conf
# Add dnsmasq to your resolver
sudo mkdir -v /etc/resolver
sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/zoonk.test'
sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/apple.test'
# Start dnsmasq
sudo brew services start dnsmasq
That's it! You can now start your local server (mix phx.server
) and test your domains using:
- https://zoonk.test:4001
- https://apple.zoonk.test:4001 (each school slug can be used as a subdomain of
zoonk.test
). - Or any other domain you added before.
We're using Resend to send emails. To make it work in production, you need to set the following environment variables on your server:
RESEND_API_KEY
: Your Resend API key.
You need to use an S3-compatible storage service to store your files. At Zoonk, we're using Tigris. You need to add the following environment variables:
AWS_ACCESS_KEY_ID
: Your AWS access key ID.AWS_SECRET_ACCESS_KEY
: Your AWS secret access key.AWS_REGION
: Your AWS region.BUCKET_NAME
: Your AWS bucket name.AWS_ENDPOINT_URL_S3
: Your AWS endpoint URL.AWS_CDN_URL
: Your AWS CDN URL (optional. If missing, we'll use the S3 endpoint URL).CSP_CONNECT_SRC
: Your S3 domain (i.e.https://fly.storage.tigris.dev
).
Follow the steps below to add a new language to Zoonk:
- Copy the
priv/gettext/en
directory topriv/gettext/<language_code>
. - Translate the
*.po
files. - Add the language code to the
locales
list in config/config.exs. - Add the language name to
@supported_locales
in lib/translate/translate_plug.ex.
- Gustavo A. Castillo
- @adriy-be
- Add your name or brand here by sponsoring our project.