{"id":15323653,"url":"https://github.com/joeig/memodrop","last_synced_at":"2025-10-09T10:31:19.222Z","repository":{"id":53413609,"uuid":"114169693","full_name":"joeig/memodrop","owner":"joeig","description":"Rapid learning process for people with tight schedules. Implementation of the Leitner system using flash cards.","archived":true,"fork":false,"pushed_at":"2021-03-30T22:48:17.000Z","size":1420,"stargazers_count":18,"open_issues_count":0,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-01-27T06:34:36.238Z","etag":null,"topics":["flashcards","leitner"],"latest_commit_sha":null,"homepage":"","language":"Python","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/joeig.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-12-13T21:16:23.000Z","updated_at":"2023-06-19T12:58:52.000Z","dependencies_parsed_at":"2022-08-27T18:52:40.233Z","dependency_job_id":null,"html_url":"https://github.com/joeig/memodrop","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/joeig/memodrop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joeig%2Fmemodrop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joeig%2Fmemodrop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joeig%2Fmemodrop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joeig%2Fmemodrop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joeig","download_url":"https://codeload.github.com/joeig/memodrop/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joeig%2Fmemodrop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279001275,"owners_count":26083040,"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-10-09T02:00:07.460Z","response_time":59,"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":["flashcards","leitner"],"created_at":"2024-10-01T09:20:51.482Z","updated_at":"2025-10-09T10:31:18.615Z","avatar_url":"https://github.com/joeig.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"memodrop\n========\n\nRapid learning process for people with tight schedules. Implementation of [flash cards](https://en.wikipedia.org/wiki/Flashcard) in Python 3 and Django.\n\n[![Build Status](https://travis-ci.org/joeig/memodrop.svg?branch=master)](https://travis-ci.org/joeig/memodrop)\n\nOut of maintenance\n------------------\n\nAlthough I've enjoyed working on this project and sharing it with the community, I decided that v1.2.4 was the final version. It has been a reliable companion on my journey, and - who knows - perhaps it also helped others to get through a demanding stage of life.\n\nPlease mind that dependencies and bugs won't be patched anymore. I'm sure you'll find a lot of great alternatives on GitHub if you search for the term \"[leitner method](https://github.com/search?q=leitner+method)\".\n\nFeatures\n--------\n\n### Implementation of the Leitner system\n\nImprove your learning effectiveness using the [Leitner system](https://en.wikipedia.org/wiki/Leitner_system). It uses a simple algorithm that asks you for cards in the first areas more frequently. Correctly answered cards are moved to the next area. Incorrectly answered cards are moved back to the previous area (\"defensive mode\") or first area (\"strict mode\").\n\n### Collaborative categories\n\nOrganize your flash cards in categories and find faster what you're looking for. You can even share your categories with your classmates!\n\n### Flash cards with hints\n\nYou don't have any clue what your flash card is talking about? No problem, just write short clues and display them if you need to.\n\n### Responsive interface\n\nUse these features on your mobile phone or tablet as well!\n\n### Multi-user\n\nCreate personalized user accounts for your friends with their own categories and cards.\n\n### REST API\n\nIf you intend to migrate your existing cards, just use the `/api/v1/categories/` and `/api/v1/cards/` endpoints.\n\nScreenshots\n-----------\n\n* [Braindump session page](/docs/screenshots/braindump_session.png?raw=true)\n* [Braindump session page (mobile optimized)](/docs/screenshots/braindump_session_mobile.png?raw=true)\n* [Index page](/docs/screenshots/braindump_index.png?raw=true)\n* [Category detail page](/docs/screenshots/category_detail.png?raw=true)\n\nInstallation\n------------\n\n### Docker setup\n\n~~~ bash\ndocker pull joeig/memodrop:latest\ndocker run -d -P --name memodrop joeig/memodrop:latest\ndocker exec -ti memodrop python manage.py createsuperuser\ndocker port memodrop\n~~~\n\nThis commands are starting a standalone web service with a local SQlite database in **development mode**. This is the quickest way to get memodrop running.\n\nIn this case, the database file is part of the container volume. If you remove the container, obviously, your data will be removed as well. Also, this setup doesn't work well if you expect more than a few concurrent users. It should never run anywhere else than on localhost.\n\n#### Production usage\n\nYou should provide a custom settings file in `memodrop/settings/production.py` (template: `production.py.dist`) containing the configuration for an external DBMS like PostgreSQL or MySQL and your own secret key.\n\nThe following guide is using Django's development server again, so consider using Gunicorn, uWSGI or mod_wsgi (WSGI interface: `memodrop.wsgi:application`, `memodrop/wsgi.py`). The static assets should rather be served by a webserver like nginx rather than WSGI (use `python manage.py collectstatic`).\n\nEnable your custom settings as following:\n\n~~~ bash\ndocker run -d -P --name memodrop \\\n  -v /path/to/your/production.py:/usr/src/app/memodrop/settings/production.py:ro \\\n  -e DJANGO_SETTINGS_MODULE=memodrop.settings.production \\\n  joeig/memodrop:latest\n\ndocker exec -ti memodrop python manage.py createsuperuser\ndocker port memodrop\n~~~\n\n### Manual setup\n\n1. Install Python 3\n2. You may want to create a virtual environment now.\n3. Install the dependencies: `python setup.py install`\n4. Production preparation: Copy `memodrop/settings/production.py.dist` to `memodrop/settings/production.py` and adjust the values\n5. Create a database or let Django do that for you (it will choose SQLite3 by default)\n6. Migrate the database: `python manage.py migrate [--settings memodrop.settings.production]`\n7. Create a super-user account: `python manage.py createsuperuser [--settings memodrop.settings.production]`\n8. * Start the application with its WSGI interface `memodrop/wsgi.py`\n   * Alternative for developers: Start the standalone web service: `python manage.py runserver [--settings memodrop.settings.production]`\n\nCreate regular user accounts\n----------------------------\n\nYou can do this with super-user permissions in Django's administration interface (`/admin/`).\n\nAPI Authorization\n-----------------\n\nThe API needs a user-specific token to authorize requests. This is accomplished by dispatching an `Authorization: Token \u003ctoken\u003e` header with all API requests.\n\nTokens are user-specific and can be optained by perfoming a POST request containing the username and password to the authorization endpoint `/api/v1/auth-token/`. Example:\n\n~~~ text\n$ curl -X POST --data \"username=\u003cusername\u003e\u0026password=\u003cpassword\u003e\" \"http://127.0.0.1:8000/api/v1/auth-token/\"\n{\n    \"token\": \"091c4c1204422cb682cc9426d097d492a56a2013\"\n}\n~~~\n\nHigh-traffic environments\n-------------------------\n\n### Enable distributed queue workers\n\nBasically, every task is executed synchronously. But under certain circumstances, you don't want to block user requests until time-consuming tasks have finished. If you are considering to run a setup with thousands of cards and users, you can enable asynchronous processing using the `Q_CLUSTER` setting in `production.py.dist`. After that, start the cluster workers using the following command: `python manage.py qcluster [--settings memodrop.settings.production]`\n\nYou should also read the official docs regarding [Django Q](https://django-q.readthedocs.io/en/latest/configure.html).\n\n### Health check endpoint\n\nThe `/admin/health/` route exposes a status endpoint which usually returns `200 OK` if the application is healthy.\n\nContribution\n------------\n\n### Setup\n\nSetup the development environment:\n\n~~~ bash\npython setup.py develop\npip install -e \".[dev]\"\n~~~\n\nThere are some fixtures for different scenarios:\n\n~~~ bash\npython manage.py loaddata demo_users  # use demo credentials from categories/fixtures/demo_users.yaml\npython manage.py loaddata demo_categories\npython manage.py loaddata demo_share_contracts\npython manage.py loaddata demo_cards\n~~~\n\n### Test\n\nFeel free to write and run some unit tests after you've finished your work.\n\n~~~ bash\ncoverage run manage.py test .\ncoverage report\nflake8\n~~~\n\n### Release\n\nCommit and tag your work (following the [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html) guidelines):\n\n~~~ bash\nbumpversion patch  # use major, minor or patch\ngit push origin master --follow-tags\n~~~\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoeig%2Fmemodrop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoeig%2Fmemodrop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoeig%2Fmemodrop/lists"}