{"id":15117000,"url":"https://github.com/andersonkrs/malheatmap","last_synced_at":"2026-02-01T16:14:03.561Z","repository":{"id":37043069,"uuid":"244220640","full_name":"andersonkrs/malheatmap","owner":"andersonkrs","description":"An extension for tracking your activities on myanimelist.net","archived":false,"fork":false,"pushed_at":"2026-01-31T14:12:03.000Z","size":54251,"stargazers_count":105,"open_issues_count":16,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-01T01:23:07.361Z","etag":null,"topics":["myanimelist","rails","ruby","webcrawling"],"latest_commit_sha":null,"homepage":"https://malheatmap.com","language":"Ruby","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/andersonkrs.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-03-01T20:43:46.000Z","updated_at":"2026-01-31T13:51:48.000Z","dependencies_parsed_at":"2023-12-24T14:30:48.347Z","dependency_job_id":"acd0e7d7-d877-41e2-9e8a-735141ee1086","html_url":"https://github.com/andersonkrs/malheatmap","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/andersonkrs/malheatmap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andersonkrs%2Fmalheatmap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andersonkrs%2Fmalheatmap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andersonkrs%2Fmalheatmap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andersonkrs%2Fmalheatmap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andersonkrs","download_url":"https://codeload.github.com/andersonkrs/malheatmap/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andersonkrs%2Fmalheatmap/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28981893,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T15:35:50.179Z","status":"ssl_error","status_checked_at":"2026-02-01T15:35:38.075Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["myanimelist","rails","ruby","webcrawling"],"created_at":"2024-09-26T01:45:28.088Z","updated_at":"2026-02-01T16:14:03.548Z","avatar_url":"https://github.com/andersonkrs.png","language":"Ruby","funding_links":["https://www.buymeacoffee.com/andersonkrs"],"categories":["Other"],"sub_categories":["Other"],"readme":"\u003ch1 align=\"center\"\u003e\n  MAL Heatmap\n\u003c/h1\u003e\n\n\u003ch4 align=\"center\"\u003e\n  \u003ca href=\"https://github.com/andersonkrs/malheatmap/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/andersonkrs/malheatmap/actions/workflows/ci.yml/badge.svg\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://uptime.betterstack.com/?utm_source=status_badge\"\u003e\u003cimg src=\"https://uptime.betterstack.com/status-badges/v1/monitor/14ang.svg\"/\u003e\u003c/a\u003e\n\u003c/h4\u003e\n\n\u003cp align=\"center\"\u003e\n \u003ca href=\"https://malheatmap.com\"\u003ehttps://malheatmap.com\u003c/a\u003e\n\u003c/p\u003e\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n          MAL Heatmap is a tool for tracking your anime/manga consumption based on your \u003ca href='https://myanimelist.net'\u003emyanimelist.net\u003c/a\u003e recent history.\u003cbr\u003e\n          This app crawls the recent user history daily and generates a full visualization of all activities like \u003ca href='https://github.blog/2013-01-07-introducing-contributions/'\u003eGithub contributions calendar\u003c/a\u003e.\n          \u003cbr\u003e\u003cbr\u003e\n          It also generates an image of your activities calendar that you can embed into your \u003ca href='https://myanimelist.net'\u003emyanimelist.net\u003c/a\u003e profile or forum signature extending your MAL experience.\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003e[!IMPORTANT]\n\u003e MAL Heatmap is my [free gifit share](https://world.hey.com/dhh/free-gift-share-8ee43637) to the community.\n\u003e\n\u003eThis app is a [finished software](https://world.hey.com/dhh/finished-software-8ee43637), meaning that we will not be taking any new features or improvements. In spite a few quirks here and there, this app has been running solid for many many years and we plan to keep it running until MAL completely blocks our Bot or the internet ends.\n\u003e\n\u003e**Please, only open issues if the service is disrupted or a major bug is found.**\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eApp\u003c/th\u003e\n    \u003cth\u003eSign in\u003c/th\u003e\n  \u003c/tr\u003e  \n  \u003ctr\u003e\n    \u003ctd\u003e\n      \u003cvideo src=\"https://github.com/andersonkrs/malheatmap/assets/3708060/81f3f590-ca46-4f68-9630-5f3afdc50d62\" alt=\"App Demo\" width=\"128\" height=\"128\"\u003e\n    \u003c/td\u003e \n    \u003ctd\u003e\n      \u003cvideo src=\"https://github.com/andersonkrs/malheatmap/assets/3708060/d9a045b4-789c-4540-88a6-999af29acc1a\" alt=\"Subscription Demo\" width=\"128\" height=\"128\"\u003e\n    \u003c/td\u003e \n  \u003c/tr\u003e  \n\u003c/table\u003e\n\n#### Profile examples\n\nHere are some real user profiles to give you an idea of how it looks like in case you don't have an MAL account:\n\n- [KanchiMoe](https://malheatmap.com/users/KanchiMoe)\n- [RudeRedis](https://malheatmap.com/users/RudeRedis)\n- [GDjkhp](https://malheatmap.com/users/GDjkhp)\n\n#### Motivation\n\nAt first, I made this experiment to play around with some cool Rails features, like [ActiveStorage](https://edgeguides.rubyonrails.org/active_storage_overview.html) and [ActionCable](https://guides.rubyonrails.org/action_cable_overview.html).\nAlso, I want to take this opportunity to try web scrapping with Ruby and have a pretty much vanilla Rails experience, which is very different from the apps that I have been working on.\n\nBuilding an app from zero to deployment has been a great experience, and I feel all its pain standing up from the ground. It's taught me a lot about sysadmin tasks, servers, docker, deployment, etc.\n\nOver the years, I've made several upgrades, adding Turbo, SolidQueue, better caching with Russian Doll caching + HTTP Caching, etc.\n\n#### How it works\n\nThe web app displays the processed data, and jobs do the hard and dirty work of crawling, processing, and saving data.\n\nWhen users subscribe via OAuth, we capture some information based on the token and then start crawling their history. We periodically run the web crawler to keep the user's history current.\n\nThe users get a calendar image that can be embedded on their MAL profile or forum signature. The image is generated in the background by taking a screenshot of their profiles using a headless Chrome controlled by [Ferrum](https://github.com/rubycdp/ferrum).\n\n#### Main Tools\n\n- Ruby on Rails\n- SQLite\n- SolidQueue\n- SolidCache\n- Hotwire\n- Bulma CSS\n\n#### Dependencies:\n\n- SQLite\n- Redis for action cable\n- Ruby\n- LibVips for ActiveStorage\n\nSince this app is a classical Rails project, there is nothing special here to set up or run the project.\n\n### Deployment\n\nThis app is gloriously deployed using [Kamal](https://kamal-deploy.org/).\n\nSince I keep this app running from my pocket, I use some space to run it on my tiny VPS. To keep costs low, we use the VPS storage to host the ActiveStorage files.\n\n#### Other Inspirations\n\n- [MAL Signature](https://malsignature.com)\n- [anime.plus](https://anime.plus)\n\n\u003ca href=\"https://www.buymeacoffee.com/andersonkrs\" target=\"_blank\"\u003e\u003cimg src=\"https://cdn.buymeacoffee.com/buttons/default-orange.png\" alt=\"Buy Me A Coffee\" height=\"41\" width=\"174\"\u003e\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandersonkrs%2Fmalheatmap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandersonkrs%2Fmalheatmap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandersonkrs%2Fmalheatmap/lists"}