{"id":29586642,"url":"https://github.com/basecamp/house-style","last_synced_at":"2025-07-20T03:31:15.293Z","repository":{"id":62968062,"uuid":"494220920","full_name":"basecamp/house-style","owner":"basecamp","description":"37signals house style","archived":false,"fork":false,"pushed_at":"2025-05-05T22:39:55.000Z","size":32,"stargazers_count":28,"open_issues_count":0,"forks_count":2,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-07-18T05:34:46.283Z","etag":null,"topics":["rubocop","rubocop-configuration","stylelint","stylelint-config"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":false,"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/basecamp.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-05-19T20:32:40.000Z","updated_at":"2025-07-04T10:45:33.000Z","dependencies_parsed_at":"2024-04-23T16:01:48.496Z","dependency_job_id":"15f85b30-a28f-4848-9466-f0f0ef34ad27","html_url":"https://github.com/basecamp/house-style","commit_stats":{"total_commits":6,"total_committers":2,"mean_commits":3.0,"dds":"0.16666666666666663","last_synced_commit":"b3ad65254828e8e8019a0d9a6205aff9ad206a77"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/basecamp/house-style","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fhouse-style","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fhouse-style/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fhouse-style/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fhouse-style/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/basecamp","download_url":"https://codeload.github.com/basecamp/house-style/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fhouse-style/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266063099,"owners_count":23870716,"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":["rubocop","rubocop-configuration","stylelint","stylelint-config"],"created_at":"2025-07-20T03:30:55.535Z","updated_at":"2025-07-20T03:31:15.288Z","avatar_url":"https://github.com/basecamp.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 37signals house style\n\n## Ruby\n\nRuboCop has built-in support for pulling config from a gem. We provide a\n`rubocop-37signals` gem for this purpose.\n\nTo introduce our house style to an app, add `rubocop-37signals` to your Gemfile:\n```ruby\ngem \"rubocop-37signals\", github: \"basecamp/house-style\", require: false\n```\n\nAnd create a boilerplate `.rubocop.yml` that inherits from `rubocop-37signals`:\n```yaml\n# 37signals house style\ninherit_gem: { rubocop-37signals: rubocop.yml }\n```\n\n### For non-Rails apps:\n```yaml\n# 37signals house style\ninherit_gem: { rubocop-37signals: rubocop-ruby.yml }\n```\n\nApp-specific config may follow, overriding the house style.\n\n## JavaScript\n\nWe use [ESLint](https://eslint.org) for our JavaScript. You'll need eslint 9 or higher to use our shared config.\n\nThe configurations is based on @eslint/js's [recommended](https://github.com/eslint/eslint/blob/main/packages/js/src/configs/eslint-recommended.js) config,\nwith a few more stylistic rules added to reflect our preferences.\n\nTo use our ruleset as a baseline, add the `@37signals/eslint-config` package:\n\n```bash\nnpm install --save-dev @37signals/eslint-config\n```\n\nOr with Yarn:\n\n```bash\nyarn add --dev @37signals/eslint-config\n```\n\nAnd extend it in your eslint.config.mjs file:\n\n```js\nimport houseStyle from \"@37signals/eslint-config\"\n\nexport default [\n  houseStyle,\n  {\n    rules: {\n      \"no-unused-vars\": [ \"off\" ]\n      ...\n    }\n  }\n]\n\n```\n\n## SCSS\n\nWe use [Stylelint](https://stylelint.io) for our SCSS.\n\nOur config extends [stylelint-config-recommended-scss](https://github.com/stylelint-scss/stylelint-config-recommended-scss) and makes it a little more lax.\n\nTo see the rules, read the [config itself](/stylelint-config-scss/index.js).\n\nTo use our small ruleset as a baseline, add the `@37signals/stylelint-config-scss` package:\n```bash\nnpm install --save-dev @37signals/stylelint-config-scss\n\n# or\nyarn add --dev @37signals/stylelint-config-scss\n```\nAnd extend it in your Stylelint config:\n```json\n{\n  \"extends\": \"@37signals/stylelint-config-scss\",\n\n  \"rules\": {\n    …\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasecamp%2Fhouse-style","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbasecamp%2Fhouse-style","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasecamp%2Fhouse-style/lists"}