{"id":28430373,"url":"https://github.com/rimltempest/favdev","last_synced_at":"2026-04-11T10:32:03.223Z","repository":{"id":157985090,"uuid":"584386964","full_name":"RimlTempest/favdev","owner":"RimlTempest","description":"技術記事を共有するサービスです。","archived":false,"fork":false,"pushed_at":"2026-04-08T21:08:56.000Z","size":448,"stargazers_count":0,"open_issues_count":10,"forks_count":0,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2026-04-08T23:13:36.856Z","etag":null,"topics":["codeql","eslint","github-actions","husky","jest","markuplint","nextjs","playwright","prisma","react","storybook","tailwindcss","trpc","typescript","zod"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/RimlTempest.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"RimlTempest"}},"created_at":"2023-01-02T12:27:07.000Z","updated_at":"2023-04-28T07:01:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"904b4fe6-14f0-42ba-8aa0-1c3775a4b46c","html_url":"https://github.com/RimlTempest/favdev","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/RimlTempest/favdev","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RimlTempest%2Ffavdev","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RimlTempest%2Ffavdev/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RimlTempest%2Ffavdev/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RimlTempest%2Ffavdev/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RimlTempest","download_url":"https://codeload.github.com/RimlTempest/favdev/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RimlTempest%2Ffavdev/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31677813,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T08:18:19.405Z","status":"ssl_error","status_checked_at":"2026-04-11T08:17:08.892Z","response_time":54,"last_error":"SSL_read: 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":["codeql","eslint","github-actions","husky","jest","markuplint","nextjs","playwright","prisma","react","storybook","tailwindcss","trpc","typescript","zod"],"created_at":"2025-06-05T14:07:02.028Z","updated_at":"2026-04-11T10:32:03.210Z","avatar_url":"https://github.com/RimlTempest.png","language":"TypeScript","funding_links":["https://github.com/sponsors/RimlTempest"],"categories":[],"sub_categories":[],"readme":"# favdev\n\n読んだ技術記事を簡単にまとめ共有するサービスです。  \nランキング付けなどを行い共有できます。  \n他にもその記事から得られた知識のメモも一緒に残すことができます。\n\nパス、シーケンス図は [こちら](./docs/設計.md)\n\n## 開発環境\n\n### ⚙️ VS Code\n\n- ESLint\n- Prettier\n- markuplint\n\n### 🗼 フロントエンド\n\nfeature driven 設計を参考にし実装を行っています。\n\n単体テストは Jest を利用し記述していきます。  \n結合テストは Storybook/Jest を利用し stories ファイルに記述していきます。  \nE2E テストは Playwright を利用し記述していきます。\n\n詳しくは以下を用いています ↓\n\n- NextJS 13 / React\n- next-auth [next-auth 公式サイト](https://next-auth.js.org/)\n- tailwind\n- lint\n  - eslint\n  - prettier\n  - markuplint\n\n### 🔨 バックエンド\n\ntRPC を利用して実装を行っていきます。  \nランキング編集画面にて WebSockets を利用したリアルタイム更新がされる仕組みを実現しています。  \nPrisma は DB の ORM ツールで CRUD 操作の効率化や可視化などを行ってくれます。  \nzod はバリデーションツールで入力情報などの制限をかけたりするのに利用しております。\n\n詳しくは以下を用いています ↓\n\n- tRPC [tRPC 公式サイト](https://trpc.io)\n- WebSockets\n- Prisma\n- zod\n\n### 💾 DB\n\n基本的に postgres を利用しています。  \nビルドやテスト時は sqlite で仮環境を作成します。\n\n- postgres\n- sqlite\n\n### ✅ テスト\n\n- Jest\n- Playwright [Playwright 公式サイト](https://playwright.dev/)\n\n### 💚 CI\n\n- GitHub Actions\n  - Lighthouse CI\n  - Playwright vrt\n  - CodeQL\n\n### 💻 効率化\n\n- docker-compose\n- Storybook\n- renovate\n\n## 環境構築\n\n```bash\n# git clone\ngit clone https://github.com/RimlTempest/favdev.git\n\n# ローカル環境\ncd favdev\n\n# パッケージ\nyarn i\n```\n\n## コマンド\n\n実行\n\n```bash\n# ビルド runs `prisma generate` + `prisma migrate` + `next build`\nyarn build\n\n# DB リセット\nyarn db-nuke\n\n# 開発環境 next.js + WebSocket server\nyarn dev\n\n# リセットして立ち上げ postgres db + runs migrations + seeds + starts next.js\nyarn dx\n\n```\n\nテスト\n\n```bash\n\n# 単体テスト 実行\nyarn test:unit\n\n# E2Eテスト 実行\nyarn test\n\n# 開発環境 E2Eテスト 実行\nyarn test:dev\n\n# 開発環境 E2Eテスト 実行\nyarn test:start\n```\n\n効率化\n\n```bash\n# storybook 立ち上げ\nyarn storybook\n\n# prisma studio立ち上げ\nyarn studio\n```\n\n## Deployment\n\n### Using [Render](https://render.com/)\n\nThe project contains a [`render.yaml`](./render.yaml) [_\"Blueprint\"_](https://render.com/docs/blueprint-spec) which makes the project easily deployable on [Render](https://render.com/).\n\nThe database is setup with a `starter` plan, but you can use a free plan for 90 days.\n\nGo to [dashboard.render.com/blueprints](https://dashboard.render.com/blueprints) and connect to this Blueprint and see how the app and database automatically gets deployed.\n\nYou will either need to create an environment group called `trpc-websockets` with environment variables or remove that from `render.yaml` in favor of manual environment variables that overrides the ones in `/.env`.\n\n## Files of note\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003ePath\u003c/th\u003e\n      \u003cth\u003eDescription\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ca href=\"./prisma/schema.prisma\"\u003e\u003ccode\u003e./prisma/schema.prisma\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003ePrisma schema\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ca href=\"./src/api/trpc/[trpc].tsx\"\u003e\u003ccode\u003e./src/api/trpc/[trpc].tsx\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003etRPC response handler\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ca href=\"./src/server/routers\"\u003e\u003ccode\u003e./src/server/routers\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003eYour app's different tRPC-routers\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frimltempest%2Ffavdev","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frimltempest%2Ffavdev","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frimltempest%2Ffavdev/lists"}