[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-7754":3},{"id":4,"name":5,"fullName":6,"owner":5,"repo":5,"description":7,"homepage":8,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":22,"topics":24,"createdAt":9,"pushedAt":9,"updatedAt":30,"readmeContent":31,"aiSummary":32,"trendingCount":15,"starSnapshotCount":15,"syncStatus":33,"lastSyncTime":34,"discoverSource":35},7754,"lobsters","lobsters\u002Flobsters","Computing-focused community centered around link aggregation and discussion","https:\u002F\u002Flobste.rs",null,"Ruby",4700,963,57,207,0,1,11,40,10,30.95,"Other",false,"main",[25,26,27,28,29],"aggregator","forum","hacktoberfest","rails","ruby","2026-06-12 02:01:44","### Lobsters Rails Project [![build status](https:\u002F\u002Fgithub.com\u002Flobsters\u002Flobsters\u002Factions\u002Fworkflows\u002Fcheck.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Flobsters\u002Flobsters\u002Factions\u002Fworkflows\u002Fcheck.yml)\n\n[Lobsters](https:\u002F\u002Flobste.rs) is a Rails codebase and uses a SQL (MariaDB in production) backend for the database.\nThe code is open source as part of our [commitment to transparency](https:\u002F\u002Flobste.rs\u002Fabout#transparency).\nIt's been used to run [sister sites](https:\u002F\u002Fgithub.com\u002Flobsters\u002Flobsters\u002Fblob\u002Fmain\u002Fsister_sites.md), but mostly we want people to be able to understand and improve what's happening on Lobsters itself.\n\nDespite the site being an [uber mega cringe](https:\u002F\u002Fbsky.app\u002Fprofile\u002Fanirudh.fi\u002Fpost\u002F3mdikk6u2w22e) [ghost town](https:\u002F\u002Fxcancel.com\u002Fwebshitweekly\u002Fstatus\u002F1399935275057389571) running on a [quite sad codebase](https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20230213161624\u002Fhttps:\u002F\u002Fold.reddit.com\u002Fr\u002Frails\u002Fcomments\u002F6jz7tq\u002Fsource_code_lobsters_a_hacker_news_clone_built\u002F), at least we have [no relation](https:\u002F\u002Flobste.rs\u002Fabout#michaelbolton) to the self-help guru.\n\n\n#### Contributing bugfixes and new features\n\nWe'd love to have your help.\nPlease see the [CONTRIBUTING](https:\u002F\u002Fgithub.com\u002Flobsters\u002Flobsters\u002Fblob\u002Fmain\u002FCONTRIBUTING.md) file for details and dev environment setup.\nIf you have questions, there is usually someone in [our chat room](https:\u002F\u002Flobste.rs\u002Fchat) who's familiar with the code.\n\nLobsters is a volunteer project with limited development time and a long time horizon, we hope to be running for decades.\nSo our design philosophy is a little different than a typical commercial product:\n\n * We started with Rails 3.2.2 in 2012, so we have a few dusty corners and places where we don't take advantage of features that were introduced since we started.\n * We lean into using Rails features instead of custom code, and we'll write a couple dozen lines of narrow code for a feature rather than add a dependency that might require maintenance.\n * We are very reluctant to add new production services and almost entirely unwilling to depend on external services.\n   We take pride in self-hosting from the VPS up, which necessitates reducing the number of moving parts.\n * We test to ensure functionality, but testing is a lot lighter for moderator and other non-core features.\n   We're trying to maximize the return on investment of testing rather than minimize errors.\n * We're willing to take downtime for big code changes rather than try to make them seamless.\n * We have users that are unusually likely to use old, experimental, and even homemade browsers, so we only use CSS in the [widely available baseline](https:\u002F\u002Fweb-platform-dx.github.io\u002Fweb-features\u002F).\n * We don't serve JavaScript to logged-out visitors, we use as little JS as possible for users with a vanilla\u002FjQuery-style of DOM attachment, we are (very slowly) making JS entirely optional for users, and we accept JS for mod features.\n   Keeping JS small and optional helps keep the site fast, and an unusually high proportion of visitors use old, odd, and homebrew browsers.\n   We do not want JavaScript in our build chain, it requires too much maintenance.\n\nPlease see [CONTRIBUTING.md](\u002FCONTRIBUTING.md) for setup.\n\n## Production\n\nYou are free to use this code to start your own [sister site](\u002Fsister_sites.md)\nbecause the code is available under a [permissive license](https:\u002F\u002Fgithub.com\u002Flobsters\u002Flobsters\u002Fblob\u002Fmain\u002FLICENSE) (3-clause BSD).\nWe welcome bug reports and code contributions that help use improve [lobste.rs](https:\u002F\u002Flobste.rs).\nAs a volunteer project we're reluctant to take on work that's not useful to our site, so please understand if we don't want to adopt your custom feature.\nThese instructions assume you know the basics of web development with Ruby on Rails on a Linux server.\n\nImportant: the hard part about starting an online community is not the codebase.\nA new social site has to solve a chicken-and-egg problem:\nnobody will want to participate on a new site until other people are participating.\nBefore you start working with the code, make a plan for how you'll reach potential community members and what they'll find engaging about the early days.\nIf you don't attract enough early users to reach a self-sustaining level of activity, the code doesn't matter!\n\nAs of February 2025 we have a [Zulip-based chat room](https:\u002F\u002Flobsters.zulipchat.com) to discuss the codebase and offer limited support to owners of sister sites like warnings about breaking changes and vulnerability announcements.\nIf you run a site using the codebase, you will benefit from joining.\n\nSetup:\n\n1. Fork the repo, clone it to your local computer.\n   You should add lobsters as a git remote so you can continue to pull our changes.\n\n2. Edit `config\u002Fapplication.rb` to put in your site's name and domain name.\n\n3. We use a paid service called [Hatchbox](https:\u002F\u002Fhatchbox.io) to set up and deploy the server.\n   Reusing this config will be much easier than Heroku\u002FRender\u002Fetc.\n...Hatchbox has a clever wizard-style flow for getting started.\n   I'm going to explain what our final settings are rather than try to stay current with the wizard setup.\n   This should be all the info you need, just in a slightly different order.\n\n  * Follow the [Hatchbox Docs](https:\u002F\u002Fhatchbox.relationkit.io\u002F) to create an account and connect a Hosting Provider.\n    We use DigitalOcean because I was already familiar with it.\n  * Create a Cluster, ours is called `lobsters`.\n    We don't have any Cluster settings customized.\n  * In your Cluster, create a Server.\n    There's a [DO limitation](https:\u002F\u002Fwww.digitalocean.com\u002Fcommunity\u002Fquestions\u002Fhow-do-i-create-a-reverse-dns-ptr-record) that the server name must match your domain name for them to create a reverse DNS PTR record that you'll need for email.\n    We don't have any Server settings customized.\n  * When a server is created, check if its [IP address is blacklisted for sending email](https:\u002F\u002Fdnschecker.org\u002Fip-blacklist-checker.php?query=68.183.100.95).\n    Email spammers constantly try to create servers on every hosting provider.\n    The providers ban them, but the IP address gets a bad reputation and may be on blocklists when it's assigned to you.\n    Check your server's IP ASAP; it's much easier to delete and recreate than get off the blocklists, especially because outsiders don't have any insight into the internal blocklists of big email providers like Google, Apple, and Microsoft.\n  * You'll need to create a Database.\n    We use MariaDB in prod but are working to [migrate to SQLite](https:\u002F\u002Fgithub.com\u002Flobsters\u002Flobsters\u002Fissues\u002F539).\n  * Create an App. Running through the Settings sections:\n    * Processes: Add a `solid_queue` process, command `bundle exec rails solid_queue:start`.\n    * Activity: This is logs, nothing to change.\n    * Repository: Connect your GitHub repo.\n    * Domains & SSL: Add your domain names, include both `example.org` and `www.example.org`.\n    * Environment:\n\n      ```\n      BUNDLE_WITHOUT      development:test\n      DATABASE_URL        trilogy:\u002F\u002F[username]:[password]@[1.2.3.4]\u002Flobsters\n      INGRESS_PASSWORD    [random generated key]\n      PORT                9000\n      RACK_ENV            production\n      RAILS_ENV           production\n      RAILS_LOG_TO_STDOUT true\n      RAILS_MAX_THREADS   10\n      SECRET_KEY_BASE     [random generated key]\n      ```\n\n      Search the codebase for uses of the `ENV` global for more that can be easily configured.\n\n    * Databases: We manage this independently of Hatchbox for historic reasons, see `#539`.\n    * Cron Jobs:\n\n      ```\n      expire_page_cache         * * * * *      script\u002Fexpire_page_cache\n      script\u002Flobsters-cron    *\u002F5 * * * *      bundle exec script\u002Flobsters-cron\n      ```\n\n    * Settings:\n      We have tweaks of production config files and we want those [tracked in our git repo](https:\u002F\u002Fgithub.com\u002Flobsters\u002Flobsters\u002Ftree\u002Fmain\u002Fhatchbox).\n      We have rigged up settings to run an (unfortunately) clever hook to update those on deploy, see below.\n\n      Pre-build script: `hatchbox\u002Fpre-build`\n      Custom build script: blank\n      Post-build script: blank\n      Post-deploy script: `hatchbox\u002Fpost-deploy`\n      Failed deploy script: blank\n      Caddyfile: copy the text of the file `hatchbox\u002FCaddyfile` from this repo.\n        As it says, you have to manually paste it in on changes and click 'Update Caddy'.\n\n  * Make a deployment with Hatchbox. Whew!\n\n4. SSH into your server as the `root` user to set up the deploy hook.\n\n    ```\n    ln -s \u002Fhome\u002Fdeploy\u002Flobsters\u002Fcurrent\u002Fhatchbox\u002Froot-deploy.service \u002Fetc\u002Fsystemd\u002Fsystem\n    ln -s \u002Fhome\u002Fdeploy\u002Flobsters\u002Fcurrent\u002Fhatchbox\u002Froot-deploy.path \u002Fetc\u002Fsystemd\u002Fsystem\n    systemctl daemon-reload\n    systemctl enable --now root-deploy.service # first backup takes 10ish min\n    systemctl enable --now root-deploy.path\n    ```\n\n5. Deploy again with Hatchbox to run the hook and finish the server provisioning.\n\n6. SSH into your server as the `deploy` user\n\n   1. Run `rails credentials:edit` to set up credentials there, like you did for development.\n      Use `config\u002Fcredentials.yml.sample` for a template.\n      On setup, Rails will give you new random value for `secret_key_base` and you can use `rails secret` any time you need to generate another.\n      Never `git commit` or share your `config\u002Fcredentials.yml.enc` or `config\u002Fmaster.key`.\n   2. [Test your mail config for spamminess](https:\u002F\u002Fwww.mail-tester.com\u002F).\n      Run `echo \"Test Postfix email, visit scnenic https:\u002F\u002Fexample.com\" | mail -s \"Postfix Test\" test-whatever@srv1.mailtester.com`\n   3. Run `rails console` and create a `User` for yourself, set `is_admin = true`.\n      You'll probably also have to create a `Category` and one `Tag` for the site to run at all.\n   4. See logs in `~deploy\u002Fsitename\u002Fshared\u002Flog`.\n\nIf everything worked, you should have a running instance now.\n\n\n#### Administration\n\nBasic moderation happens on-site, but some administrative tasks require use of the rails console in production.\nAdministrators can create and edit tags at `\u002Ftags`, the mod dashboard is at `\u002Fmod`.\n","Lobsters 是一个以计算为中心的社区，专注于链接聚合和讨论。该项目基于 Ruby on Rails 构建，并使用 MariaDB 作为后端数据库。Lobsters 重视代码透明度和自托管能力，尽量减少对外部服务的依赖，采用轻量级的测试策略来确保核心功能的稳定运行，同时对非核心特性采取较为宽松的测试标准。它适合需要构建类似 Hacker News 社区但希望拥有更高自主控制权和技术透明度的场景。此外，Lobsters 对于支持旧版或实验性浏览器以及提供低 JavaScript 依赖选项方面也做了特别优化，确保了更广泛的用户兼容性和网站性能。",2,"2026-06-11 03:14:11","top_language"]