{"id":15477095,"url":"https://github.com/ichard26/toomanycards","last_synced_at":"2025-08-11T13:14:43.762Z","repository":{"id":186649738,"uuid":"659540165","full_name":"ichard26/toomanycards","owner":"ichard26","description":"An overengineered Quizlet \"replacement\".","archived":false,"fork":false,"pushed_at":"2024-10-20T00:08:49.000Z","size":378,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-06T07:52:28.900Z","etag":null,"topics":["fastapi","flashcards","nginx","sveltekit"],"latest_commit_sha":null,"homepage":"https://yeah-no-i-am-not-hosting-a-public-instance.ca","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ichard26.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-THIRDPARTY.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-28T03:58:47.000Z","updated_at":"2024-10-20T00:08:52.000Z","dependencies_parsed_at":"2024-11-26T08:46:03.376Z","dependency_job_id":null,"html_url":"https://github.com/ichard26/toomanycards","commit_stats":{"total_commits":74,"total_committers":2,"mean_commits":37.0,"dds":"0.013513513513513487","last_synced_commit":"5f37abef43fa23c62a125e907b5d8a267ac5c044"},"previous_names":["ichard26/toomanycards"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ichard26%2Ftoomanycards","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ichard26%2Ftoomanycards/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ichard26%2Ftoomanycards/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ichard26%2Ftoomanycards/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ichard26","download_url":"https://codeload.github.com/ichard26/toomanycards/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248402262,"owners_count":21097328,"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":["fastapi","flashcards","nginx","sveltekit"],"created_at":"2024-10-02T03:43:54.890Z","updated_at":"2025-04-11T12:33:15.511Z","avatar_url":"https://github.com/ichard26.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TooManyCards (TMC)\n\n**An overengineered Quizlet \"replacement\".**\n\nSo, uh, welcome to what has been my pet project for a month or so. If you came here\nlooking for a viable alternative to Quizlet, this is... not it. It's intended for only one\nuser: me! (and I have quite basic needs...)\n\nOtherwise, enjoy my probably terrible code as TMC is also my chance to learn API design\nand modern frontend development. 🌺\n\n## License\n\nI don't know why you'd want to reuse this code, but the project is licensed under the\n[Mozilla Public License 2.0](./LICENSE.txt) just in case. Licenses of \"borrowed\" code\n[can be found in `LICENSE-THIRDPARTY.md`](./LICENSE-THIRDPARTY.md).\n\n## Security\n\nThe short of it is \"don't trust me, I don't know what I'm doing, mostly.\"\n\nThe long answer [can be found in `SECURITY.md`.](./SECURITY.md)\n\n## To-do list\n\n- Deck creation and edit routes\n- PWA support\n  - Basic offline support\n- ~~Public decks~~\n- More modes:\n  - \"Flashcard\" mode\n  - Test mode\n  - Spaced repetition mode (depends on storing results)\n- Result breakdown on deck completion\n- Result storage (for \"these are the terms that you need to work on the most\")\n- Reworked UI\n\nLower priority:\n\n- GitHub (and potentially Google...?) Sign-on\n- Private deck sharing (à la Google Docs)\n- Admin UI\n- Markdown support\n- An API test suite\n\n## API database (SQLite) schema\n\n```sql\nCREATE TABLE \"users\" (\n    \"username\"         TEXT PRIMARY KEY NOT NULL,\n    \"hashed_password\"  TEXT NOT NULL,\n    \"display_name\"     TEXT,\n    \"is_admin\"         INTEGER NOT NULL DEFAULT 0,\n    \"created_at\"       TEXT NOT NULL,\n);\n\nCREATE TABLE \"decks\" (\n    \"id\"               INTEGER PRIMARY KEY AUTOINCREMENT,\n    \"title\"            TEXT NOT NULL,\n    \"description\"      TEXT NOT NULL,\n    \"owner\"            TEXT,\n    \"public\"           INTEGER NOT NULL DEFAULT 0,\n    \"created_at\"       TEXT NOT NULL,\n    \"updated_at\"       TEXT NOT NULL,\n    \"accessed_at\"      TEXT NOT NULL,\n    FOREIGN KEY(\"owner\") REFERENCES \"users\"(\"username\") ON UPDATE CASCADE,\n);\n\nCREATE TABLE \"cards\" (\n    \"id\"               INTEGER PRIMARY KEY NOT NULL,\n    \"deck_id\"          INTEGER NOT NULL,\n    \"term\"             TEXT NOT NULL,\n    \"definition\"       TEXT NOT NULL,\n    FOREIGN KEY(\"deck_id\") REFERENCES \"decks\"(\"id\") ON DELETE CASCADE,\n);\n\nCREATE TABLE \"requests\" (\n    \"datetime\"   TEXT PRIMARY KEY NOT NULL,\n    \"ip\"         TEXT,\n    \"useragent\"  TEXT,\n    \"referer\"    TEXT,\n    \"verb\"       TEXT NOT NULL,\n    \"path\"       TEXT NOT NULL,\n    \"status\"     INTEGER NOT NULL,\n    \"duration\"   REAL NOT NULL\n);\n\nCREATE TABLE \"sessions\" (\n    \"id\"              TEXT NOT NULL UNIQUE,\n    \"username\"\t      TEXT NOT NULL,\n    \"refresh_token\"\t  TEXT PRIMARY KEY NOT NULL,\n    \"refresh_expiry\"  TEXT NOT NULL,\n    \"access_token\"    TEXT NOT NULL UNIQUE,\n    \"access_expiry\"   TEXT NOT NULL,\n    \"created_at\"      TEXT NOT NULL,\n    FOREIGN KEY(\"username\") REFERENCES \"users\"(\"username\")\n      ON UPDATE CASCADE ON DELETE CASCADE\n);\n\nCREATE TABLE \"_ratelimits\" (\n    \"key\"       TEXT NOT NULL,\n    \"duration\"  INTEGER NOT NULL,\n    \"value\"     INTEGER NOT NULL,\n    \"expiry\"    TEXT NOT NULL,\n    PRIMARY KEY(\"key\", \"expiry\")\n);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fichard26%2Ftoomanycards","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fichard26%2Ftoomanycards","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fichard26%2Ftoomanycards/lists"}