{"id":17399304,"url":"https://github.com/feross/braingrinder","last_synced_at":"2025-12-17T13:49:35.223Z","repository":{"id":1621427,"uuid":"2299826","full_name":"feross/BrainGrinder","owner":"feross","description":"Instant foreign language flashcards (with audio!)","archived":false,"fork":false,"pushed_at":"2019-10-23T18:18:42.000Z","size":236,"stargazers_count":34,"open_issues_count":0,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-31T11:31:44.277Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://feross.org/hacks/braingrinder","language":"CSS","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/feross.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}},"created_at":"2011-08-31T05:48:32.000Z","updated_at":"2023-09-08T16:30:24.000Z","dependencies_parsed_at":"2022-09-09T12:00:42.790Z","dependency_job_id":null,"html_url":"https://github.com/feross/BrainGrinder","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/feross/BrainGrinder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feross%2FBrainGrinder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feross%2FBrainGrinder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feross%2FBrainGrinder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feross%2FBrainGrinder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/feross","download_url":"https://codeload.github.com/feross/BrainGrinder/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feross%2FBrainGrinder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27783730,"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-12-17T02:00:08.291Z","response_time":55,"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":[],"created_at":"2024-10-16T15:15:28.717Z","updated_at":"2025-12-17T13:49:35.208Z","avatar_url":"https://github.com/feross.png","language":"CSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BrainGrinder - Instant foreign language flashcards\n\n[Instant.fm](http://instant.fm) is not done yet, but check out what I whipped up in 3 hours using jQuery 1.5 deferreds, jQuery templates, and the Google Translate API!\n\nAutomatic foreign language flashcards!\n\n## How it works\n\n### Fetching MP3s from Google Transalate\n\nNothing is running server side, except for the text-to-speech which is actually scraped from Google Translate using a simple [Tornado](http://www.tornadoweb.org/) AsyncHTTPClient. It is not possible to fetch the audio from Google on the client-side, since Google blocks all requests that have a non-Google referer header (though empty referer headers are allowed). Interestingly, Firefox doesn't send a referer header on mp3 file requests embedded with flash or HTML5 audio, while Chrome and Safari do. So, if I only cared about Firefox, I could really get everything working client side by including the mp3 directly in the page.\n\nSince supporting Chrome and Safari is important, we fetch the mp3s from Google's text-to-speech (tts) service (the one that powers the audio on Google Translate) and cache the files server-side.\n\n### Displaying the flashcards\n\nI used a bunch of CSS3. It's pretty self-explanatory, just look at the source.\n\n## Server Software\n\n* Tornado Web Server - \u003chttp://www.tornadoweb.org/\u003e\n* Supervisor - \u003chttp://supervisord.org/\u003e (used to daemonize the Tornado process)\n\n## JavaScript Libraries\n\n* SoundManager2 - \u003chttp://www.schillmania.com/projects/soundmanager2/\u003e\n* JavaScript SHA1 - \u003chttp://pajhome.org.uk/crypt/md5/\u003e\n* jQuery - \u003chttp://jquery.com/\u003e\n* Modernizr - \u003chttp://www.modernizr.com/\u003e\n* HTML5 Boilerplate - \u003chttp://html5boilerplate.com/\u003e\n\n## jQuery Plugins\n\n* jQuery Hotkeys - \u003chttps://github.com/jeresig/jquery.hotkeys\u003e\n* jQuery QuickFlip - \u003chttp://jonraasch.com/blog/quickflip-2-jquery-plugin\u003e (used as a fallback when CSS3 translation is unavailable)\n* jQuery Templates - \u003chttp://api.jquery.com/category/plugins/templates/\u003e\n* jQuery TouchWipe - \u003chttp://plugins.jquery.com/project/Touchwipe-iPhone-iPad-wipe-gesture\u003e\n\n## TODO\n\n* save decks\n* edit current deck (more obvious)\n* pronunciation guide\n* add opengraph tags\n* shuffle cards button\n* image for each card\n* repeat sound button","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeross%2Fbraingrinder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffeross%2Fbraingrinder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeross%2Fbraingrinder/lists"}