{"id":21434713,"url":"https://github.com/ilmoi/sol_wtf","last_synced_at":"2025-07-14T14:31:57.293Z","repository":{"id":49608677,"uuid":"372774042","full_name":"ilmoi/sol_wtf","owner":"ilmoi","description":"oss code for sol.wtf","archived":false,"fork":false,"pushed_at":"2021-06-20T14:51:29.000Z","size":971,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-08T09:25:06.734Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","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/ilmoi.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":"2021-06-01T09:29:19.000Z","updated_at":"2024-06-15T15:18:51.000Z","dependencies_parsed_at":"2022-09-19T17:43:19.049Z","dependency_job_id":null,"html_url":"https://github.com/ilmoi/sol_wtf","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ilmoi/sol_wtf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilmoi%2Fsol_wtf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilmoi%2Fsol_wtf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilmoi%2Fsol_wtf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilmoi%2Fsol_wtf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ilmoi","download_url":"https://codeload.github.com/ilmoi/sol_wtf/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilmoi%2Fsol_wtf/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265305746,"owners_count":23743894,"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":[],"created_at":"2024-11-22T23:40:12.401Z","updated_at":"2025-07-14T14:31:56.953Z","avatar_url":"https://github.com/ilmoi.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Project goals\n\n1. Learn rust by building something remotely real\n2. Build something useful for the $SOL community\n3. OSS the code for future rust learners\n\n# Project description\n\nsol.wtf is a simple resource for anyone short on time to quickly get up to date on the $SOL\necosystem. It aggregates top posts from Twitter / Reddit / other\n[Solana-relevant platfroms](https://solana.com/community). Currently only Twitter is implemented.\n\nWhat's the difference with eg just using Twitter? Twitter wants you to spend\nas MUCH time on their website as possible and so even if you follow the right\npeople your timeline will be optimized in a way to waste your time. \n\nsol.wtf is the opposite of that. We want you to spend as LITTLE time on the\nwebsite as possible. So we surface the top posts first and you can keep\nscrolling for as much (or little) as you want. From personal experirence checking the\nwebsite once a day for 2-3min is sufficient to stay in the loop.\n\n# Implementation\n\nThe stack is Rust + Vue2 + AWS/Terraform/github actions.\n\nA few decisions I made along the way:\n- Scheduled tweet pull occurs as part of main runtime. I decided the operation wasn't heavy enough to involve redis / build a job queue.\n- Tweets are pulled every hour. 5 last tweets are pulled for each timeline, without regard for whether they've been pulled previously. This is to update metrics like quote count.\n- Default ranking is by popularity (retweet/quote count + like count + comment count).\n- Twitter's rate limits are a bitch, keep that in mind. You only get 500k tweets/mo and 900 or 1500 api calls (depending on endpoint) per 15min.\n- I had to rebuild twitter's formatting on the front-end because their oembed-js library is slow as fuck.\n\n\n# Development\n- Git clone the repo\n- Create a `backend/secrets/twitter.yml` file and format it like so:\n```yaml\ntwitter:\n  bearer_token: XXX\n```\n- Create a `terraform/terraform.tfvars` file and format it like so:\n```shell\ndb_username = \"postgres\"\ndb_password = \"your_db_pw\"\n```\n- Add the below 2 lines to your `.zshrc` or equivalent:\n```shell\nexport AWS_ACCESS_KEY_ID=xxx\nexport AWS_SECRET_ACCESS_KEY=xxx\n```\n- Edit any other config you might want to in `backend/config`\n\nTo launch locally:\n- `cd` into frontend and do `yarn` then `yarn serve`\n- `cd` into backend and do `RUST_LOG=\u003clevel\u003e cargo run`, where you replace \u003clevel\u003e with debug/info/error etc\n\nTo launch in prod:\n- from the main dir do `docker-compose -f terraform/docker-compose.TERRA.yml run --rm terraform apply`\n\n# Improvements / future work\n- Add other news sources - reddit / discord / more stuff from solana [here](https://solana.com/community)\n- Add an option to only show tweets the user hasn't seen already in the last 24h\n- Twitter provides the location of each tweet in the API... print on map? Dunno why\n- Have a stats page with some charts with number of tweets / posts / etc\n- Have a ranking of top posters\n- Have a way for the community to vote on what accounts should be followed\n- Make the search algo smarter / more efficient\n- Add a subscribe feature so you can receive X top posts/tweets into your inbox daily or however often you want\n- Fix tweet display on the frontend ([not everything's perfect](https://www.notion.so/ilmoi/better-tweet-display-dad2f209dd154cb1802e01fe5ba7c297))\n\n# Rust resources\n\nI used the following resources (in the below order) to teach myself enough rust to build\nthis:\n1. [Udemy - Rust crash course](https://www.udemy.com/course/ultimate-rust-crash-course/) (3hr). Awesome because short and won't get you bored. Perfect to get started.\n2. [\"The book\"](https://doc.rust-lang.org/stable/book/) / [Rustlings exercises](https://github.com/rust-lang/rustlings/tree/main/exercises) that go with it. Awesome because comprehensive. A bit of a grind but have to do it.\n3. [Luca Palmieri's zero2prod book](https://www.zero2prod.com/index.html?country=Latvia\u0026discount_code=EEU60). Awesome because covers rust web servers in great detail - and makes you a better engineer as a whole along the way. I honestly can't recommend this enough (Luca is not paying me).\n4. Blood, sweat and tears. Some red bulls for long nights.\n\n# Contributions\n\nApe in. Any questions, find me here -\u003e iljamoi@pm.me.\n\n# License\n\nMIT \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filmoi%2Fsol_wtf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Filmoi%2Fsol_wtf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filmoi%2Fsol_wtf/lists"}