Listen to and share the music in the Atmosphere. musicsky.up.railway.app/
nextjs atproto music typescript react
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

refactor: convert to turborepo monorepo

Move Next.js webapp into apps/web/ and extract lexicons into
packages/lexicons/ as a shared workspace package to prepare for
adding an AT Protocol appview alongside the existing webapp.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: mejsiejdev <mejsiejdev@gmail.com>

authored by

mejsiejdev
Claude Opus 4.6
and committed by tangled.org f4558a67 6c1956e8

+251 -108
+9 -13
.gitignore
··· 1 1 # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 2 3 3 # dependencies 4 - /node_modules 5 - /.pnp 6 - .pnp.* 7 - .yarn/* 8 - !.yarn/patches 9 - !.yarn/plugins 10 - !.yarn/releases 11 - !.yarn/versions 4 + node_modules 12 5 13 6 # testing 14 - /coverage 7 + coverage 15 8 16 9 # next.js 17 - /.next/ 18 - /out/ 10 + .next/ 11 + out/ 19 12 20 13 # production 21 - /build 14 + build 22 15 23 16 # misc 24 17 .DS_Store ··· 43 36 # database 44 37 app.db* 45 38 39 + # turbo 40 + .turbo 41 + 46 42 # claude 47 43 .claude/settings.local.json 48 - .claude/worktrees/* 44 + .claude/worktrees/*
+1
.husky/pre-commit
··· 1 1 lint-staged 2 + pnpm run lint 2 3 pnpm run typecheck
-1
.lintstagedrc
··· 1 1 { 2 - "*.{ts,tsx}": "eslint --fix", 3 2 "*": "prettier --ignore-unknown --write" 4 3 }
+3 -2
.prettierignore
··· 2 2 out 3 3 build 4 4 node_modules 5 - src/lib/lexicons 6 - lexicons 5 + packages/lexicons/src 6 + packages/lexicons/defs 7 + .turbo
+8
apps/web/knip.json
··· 1 + { 2 + "$schema": "https://unpkg.com/knip@5/schema.json", 3 + "tags": ["-lintignore"], 4 + "ignoreIssues": { 5 + "src/components/ui/**": ["exports", "types", "classMembers"] 6 + }, 7 + "ignoreDependencies": ["@knip/mcp"] 8 + }
+60
apps/web/package.json
··· 1 + { 2 + "name": "web", 3 + "version": "0.1.0", 4 + "private": true, 5 + "scripts": { 6 + "dev": "pnpm run migrate && next dev", 7 + "build": "next build", 8 + "start": "pnpm run migrate && next start", 9 + "lint": "eslint", 10 + "migrate": "tsx src/scripts/migrate.ts", 11 + "lint:fix": "eslint --fix", 12 + "typecheck": "tsc", 13 + "gen-key": "tsx src/scripts/gen-key.ts", 14 + "knip": "knip" 15 + }, 16 + "dependencies": { 17 + "@atproto/api": "^0.19.0", 18 + "@atproto/common-web": "^0.4.18", 19 + "@atproto/identity": "^0.4.12", 20 + "@atproto/lexicon": "^0.6.1", 21 + "@atproto/oauth-client-node": "^0.3.17", 22 + "@hookform/resolvers": "^5.2.2", 23 + "better-sqlite3": "^12.6.2", 24 + "class-variance-authority": "^0.7.1", 25 + "clsx": "^2.1.1", 26 + "date-fns": "^4.1.0", 27 + "kysely": "^0.28.11", 28 + "lucide-react": "^0.575.0", 29 + "next": "16.2.0-canary.103", 30 + "next-themes": "^0.4.6", 31 + "radix-ui": "^1.4.3", 32 + "react": "^19.2.4", 33 + "react-dom": "^19.2.4", 34 + "react-hook-form": "^7.71.2", 35 + "sonner": "^2.0.7", 36 + "tailwind-merge": "^3.5.0", 37 + "zod": "^4.3.6", 38 + "zustand": "^5.0.11" 39 + }, 40 + "devDependencies": { 41 + "@knip/mcp": "^0.0.20", 42 + "@tailwindcss/postcss": "^4", 43 + "@types/better-sqlite3": "^7.6.13", 44 + "@types/node": "^20", 45 + "@types/react": "^19", 46 + "@types/react-dom": "^19", 47 + "babel-plugin-react-compiler": "1.0.0", 48 + "eslint": "^9", 49 + "eslint-config-next": "^16.1.7", 50 + "eslint-config-prettier": "^10.1.8", 51 + "eslint-plugin-import-x": "^4.16.2", 52 + "knip": "^5.86.0", 53 + "postcss": "^8", 54 + "shadcn": "^4.0.0", 55 + "tailwindcss": "^4", 56 + "tsx": "^4.21.0", 57 + "tw-animate-css": "^1.4.0", 58 + "typescript": "^5" 59 + } 60 + }
components.json apps/web/components.json
+1 -7
eslint.config.mjs apps/web/eslint.config.mjs
··· 50 50 "arrow-body-style": ["error", "as-needed"], 51 51 }, 52 52 }, 53 - globalIgnores([ 54 - ".next/**", 55 - "out/**", 56 - "build/**", 57 - "next-env.d.ts", 58 - "src/lib/lexicons/**", 59 - ]), 53 + globalIgnores([".next/**", "out/**", "build/**", "next-env.d.ts"]), 60 54 eslintConfigPrettier, 61 55 ]); 62 56
-14
knip.json
··· 1 - { 2 - "$schema": "https://unpkg.com/knip@5/schema.json", 3 - "tags": ["-lintignore"], 4 - "ignoreFiles": ["src/lib/lexicons/**"], 5 - "ignoreIssues": { 6 - "src/components/ui/**": ["exports", "types", "classMembers"] 7 - }, 8 - "ignoreDependencies": [ 9 - "@atproto/xrpc", 10 - "multiformats", 11 - "@knip/mcp", 12 - "lint-staged" 13 - ] 14 - }
lexicons/app/musicsky/temp/comment.json packages/lexicons/defs/app/musicsky/temp/comment.json
lexicons/app/musicsky/temp/like.json packages/lexicons/defs/app/musicsky/temp/like.json
lexicons/app/musicsky/temp/playlist.json packages/lexicons/defs/app/musicsky/temp/playlist.json
lexicons/app/musicsky/temp/repost.json packages/lexicons/defs/app/musicsky/temp/repost.json
lexicons/app/musicsky/temp/song.json packages/lexicons/defs/app/musicsky/temp/song.json
next.config.ts apps/web/next.config.ts
+7 -55
package.json
··· 1 1 { 2 2 "name": "musicsky", 3 - "version": "0.1.0", 4 3 "private": true, 5 4 "packageManager": "pnpm@9.15.0", 6 5 "scripts": { 7 - "dev": "pnpm run migrate && next dev", 8 - "build": "next build", 9 - "start": "pnpm run migrate && next start", 10 - "lint": "eslint", 11 - "migrate": "tsx src/scripts/migrate.ts", 12 - "lint:fix": "eslint --fix", 6 + "dev": "turbo run dev", 7 + "build": "turbo run build", 8 + "lint": "turbo run lint", 9 + "typecheck": "turbo run typecheck", 10 + "knip": "turbo run knip", 13 11 "format": "prettier --write .", 14 12 "format:check": "prettier --check .", 15 - "typecheck": "tsc", 16 - "prepare": "husky", 17 - "gen-key": "tsx src/scripts/gen-key.ts", 18 - "knip": "knip" 19 - }, 20 - "dependencies": { 21 - "@atproto/api": "^0.19.0", 22 - "@atproto/common-web": "^0.4.18", 23 - "@atproto/identity": "^0.4.12", 24 - "@atproto/lexicon": "^0.6.1", 25 - "@atproto/oauth-client-node": "^0.3.17", 26 - "@atproto/xrpc": "^0.7.7", 27 - "@hookform/resolvers": "^5.2.2", 28 - "better-sqlite3": "^12.6.2", 29 - "class-variance-authority": "^0.7.1", 30 - "clsx": "^2.1.1", 31 - "date-fns": "^4.1.0", 32 - "kysely": "^0.28.11", 33 - "lucide-react": "^0.575.0", 34 - "multiformats": "^13.4.2", 35 - "next": "16.2.0-canary.103", 36 - "next-themes": "^0.4.6", 37 - "radix-ui": "^1.4.3", 38 - "react": "^19.2.4", 39 - "react-dom": "^19.2.4", 40 - "react-hook-form": "^7.71.2", 41 - "sonner": "^2.0.7", 42 - "tailwind-merge": "^3.5.0", 43 - "zod": "^4.3.6", 44 - "zustand": "^5.0.11" 13 + "prepare": "husky" 45 14 }, 46 15 "devDependencies": { 47 - "@knip/mcp": "^0.0.20", 48 - "@tailwindcss/postcss": "^4", 49 - "@types/better-sqlite3": "^7.6.13", 50 - "@types/node": "^20", 51 - "@types/react": "^19", 52 - "@types/react-dom": "^19", 53 - "babel-plugin-react-compiler": "1.0.0", 54 - "eslint": "^9", 55 - "eslint-config-next": "^16.1.7", 56 - "eslint-config-prettier": "^10.1.8", 57 - "eslint-plugin-import-x": "^4.16.2", 58 16 "husky": "^9.1.7", 59 - "knip": "^5.86.0", 60 17 "lint-staged": "^16.2.7", 61 - "postcss": "^8", 62 18 "prettier": "^3.8.1", 63 - "shadcn": "^4.0.0", 64 - "tailwindcss": "^4", 65 - "tsx": "^4.21.0", 66 - "tw-animate-css": "^1.4.0", 67 - "typescript": "^5" 19 + "turbo": "^2" 68 20 } 69 21 }
+12
packages/lexicons/package.json
··· 1 + { 2 + "name": "lexicons", 3 + "version": "0.0.0", 4 + "private": true, 5 + "main": "src/index.ts", 6 + "types": "src/index.ts", 7 + "dependencies": { 8 + "@atproto/lexicon": "^0.6.1", 9 + "@atproto/xrpc": "^0.7.7", 10 + "multiformats": "^13.4.2" 11 + } 12 + }
+17
packages/lexicons/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ES2017", 4 + "lib": ["esnext"], 5 + "strict": true, 6 + "noEmit": true, 7 + "esModuleInterop": true, 8 + "module": "esnext", 9 + "moduleResolution": "bundler", 10 + "resolveJsonModule": true, 11 + "verbatimModuleSyntax": true, 12 + "skipLibCheck": true, 13 + "incremental": true 14 + }, 15 + "include": ["src/**/*.ts"], 16 + "exclude": ["node_modules"] 17 + }
+109 -15
pnpm-lock.yaml
··· 6 6 7 7 importers: 8 8 .: 9 + devDependencies: 10 + husky: 11 + specifier: ^9.1.7 12 + version: 9.1.7 13 + lint-staged: 14 + specifier: ^16.2.7 15 + version: 16.2.7 16 + prettier: 17 + specifier: ^3.8.1 18 + version: 3.8.1 19 + turbo: 20 + specifier: ^2 21 + version: 2.8.19 22 + 23 + apps/web: 9 24 dependencies: 10 25 "@atproto/api": 11 26 specifier: ^0.19.0 ··· 22 37 "@atproto/oauth-client-node": 23 38 specifier: ^0.3.17 24 39 version: 0.3.17 25 - "@atproto/xrpc": 26 - specifier: ^0.7.7 27 - version: 0.7.7 28 40 "@hookform/resolvers": 29 41 specifier: ^5.2.2 30 42 version: 5.2.2(react-hook-form@7.71.2(react@19.2.4)) ··· 46 58 lucide-react: 47 59 specifier: ^0.575.0 48 60 version: 0.575.0(react@19.2.4) 49 - multiformats: 50 - specifier: ^13.4.2 51 - version: 13.4.2 52 61 next: 53 62 specifier: 16.2.0-canary.103 54 63 version: 16.2.0-canary.103(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) ··· 113 122 eslint-plugin-import-x: 114 123 specifier: ^4.16.2 115 124 version: 4.16.2(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.3(jiti@2.6.1)) 116 - husky: 117 - specifier: ^9.1.7 118 - version: 9.1.7 119 125 knip: 120 126 specifier: ^5.86.0 121 127 version: 5.86.0(@types/node@20.19.37)(typescript@5.9.3) 122 - lint-staged: 123 - specifier: ^16.2.7 124 - version: 16.2.7 125 128 postcss: 126 129 specifier: ^8 127 130 version: 8.5.6 128 - prettier: 129 - specifier: ^3.8.1 130 - version: 3.8.1 131 131 shadcn: 132 132 specifier: ^4.0.0 133 133 version: 4.0.0(@types/node@20.19.37)(typescript@5.9.3) ··· 143 143 typescript: 144 144 specifier: ^5 145 145 version: 5.9.3 146 + 147 + packages/lexicons: 148 + dependencies: 149 + "@atproto/lexicon": 150 + specifier: ^0.6.1 151 + version: 0.6.1 152 + "@atproto/xrpc": 153 + specifier: ^0.7.7 154 + version: 0.7.7 155 + multiformats: 156 + specifier: ^13.4.2 157 + version: 13.4.2 146 158 147 159 packages: 148 160 "@alloc/quick-lru@5.2.0": ··· 2628 2640 integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==, 2629 2641 } 2630 2642 2643 + "@turbo/darwin-64@2.8.19": 2644 + resolution: 2645 + { 2646 + integrity: sha512-WNzpqJV7rO/oKmsxjtSFXuV87fZb/qxzeGWXJng4oHFz7iPOFSWrPb2gTazJgoTvXUfe1kOH2o0F+zFrerwzRw==, 2647 + } 2648 + cpu: [x64] 2649 + os: [darwin] 2650 + 2651 + "@turbo/darwin-arm64@2.8.19": 2652 + resolution: 2653 + { 2654 + integrity: sha512-KTq8/PH0/ml9bNFomZ2VjmOqW6RYPRqBqV5CfNeD5ekJMuNwJUdeQz0qXguxCzW4OkHCnTdPeKIehR0cdQObPg==, 2655 + } 2656 + cpu: [arm64] 2657 + os: [darwin] 2658 + 2659 + "@turbo/linux-64@2.8.19": 2660 + resolution: 2661 + { 2662 + integrity: sha512-d0xcXiGUt1Q/HzMfgkqai5KyXrassLRuUZhxmUs4ZX99tQFbqRL2/CkSKCnMqyDv7c0K5eugLerVUY+DYr1DQg==, 2663 + } 2664 + cpu: [x64] 2665 + os: [linux] 2666 + 2667 + "@turbo/linux-arm64@2.8.19": 2668 + resolution: 2669 + { 2670 + integrity: sha512-UX3r1iwqsOK8dMgKFtZpDqZk7feqHXZJ/EQAknh0SVQrnc4vkm6mZqjX4j2j3DVoSo4Ho8xGITYlor9Xxsyomw==, 2671 + } 2672 + cpu: [arm64] 2673 + os: [linux] 2674 + 2675 + "@turbo/windows-64@2.8.19": 2676 + resolution: 2677 + { 2678 + integrity: sha512-3MrvD/gMYWfQKZVZOeilKm1629zPG0+KlErZbI0n9Nr3L32+5qrZOF/cgWErukLnOSR38whgf8t2WaPJQALqxg==, 2679 + } 2680 + cpu: [x64] 2681 + os: [win32] 2682 + 2683 + "@turbo/windows-arm64@2.8.19": 2684 + resolution: 2685 + { 2686 + integrity: sha512-j+8mi7kyEgT7cUTPOtPJS8KbTWxu4+OQBiDIo+zklz/RKV4hoN+k4+J8iCM9Nj+o+SVnzc01xSI+s3eBG0MDSA==, 2687 + } 2688 + cpu: [arm64] 2689 + os: [win32] 2690 + 2631 2691 "@tybys/wasm-util@0.10.1": 2632 2692 resolution: 2633 2693 { ··· 6787 6847 integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, 6788 6848 } 6789 6849 6850 + turbo@2.8.19: 6851 + resolution: 6852 + { 6853 + integrity: sha512-9NTKvQZ/02XnJCSU4mF5gvAPK+nuLbvCtft/NE8dJeOwaup0bJ14rYx7TxmSXp8JJuAN8nAjqfXWFsWwoQSFHg==, 6854 + } 6855 + hasBin: true 6856 + 6790 6857 tw-animate-css@1.4.0: 6791 6858 resolution: 6792 6859 { ··· 8938 9005 fast-glob: 3.3.3 8939 9006 minimatch: 10.2.4 8940 9007 path-browserify: 1.0.1 9008 + 9009 + "@turbo/darwin-64@2.8.19": 9010 + optional: true 9011 + 9012 + "@turbo/darwin-arm64@2.8.19": 9013 + optional: true 9014 + 9015 + "@turbo/linux-64@2.8.19": 9016 + optional: true 9017 + 9018 + "@turbo/linux-arm64@2.8.19": 9019 + optional: true 9020 + 9021 + "@turbo/windows-64@2.8.19": 9022 + optional: true 9023 + 9024 + "@turbo/windows-arm64@2.8.19": 9025 + optional: true 8941 9026 8942 9027 "@tybys/wasm-util@0.10.1": 8943 9028 dependencies: ··· 11677 11762 tunnel-agent@0.6.0: 11678 11763 dependencies: 11679 11764 safe-buffer: 5.2.1 11765 + 11766 + turbo@2.8.19: 11767 + optionalDependencies: 11768 + "@turbo/darwin-64": 2.8.19 11769 + "@turbo/darwin-arm64": 2.8.19 11770 + "@turbo/linux-64": 2.8.19 11771 + "@turbo/linux-arm64": 2.8.19 11772 + "@turbo/windows-64": 2.8.19 11773 + "@turbo/windows-arm64": 2.8.19 11680 11774 11681 11775 tw-animate-css@1.4.0: {} 11682 11776
+3
pnpm-workspace.yaml
··· 1 + packages: 2 + - "apps/*" 3 + - "packages/*"
postcss.config.mjs apps/web/postcss.config.mjs
public/file.svg apps/web/public/file.svg
public/globe.svg apps/web/public/globe.svg
public/next.svg apps/web/public/next.svg
public/vercel.svg apps/web/public/vercel.svg
public/window.svg apps/web/public/window.svg
src/app/(main)/[handle]/[rkey]/page.tsx apps/web/src/app/(main)/[handle]/[rkey]/page.tsx
src/app/(main)/[handle]/[rkey]/song-view.tsx apps/web/src/app/(main)/[handle]/[rkey]/song-view.tsx
src/app/(main)/[handle]/info.tsx apps/web/src/app/(main)/[handle]/info.tsx
src/app/(main)/[handle]/layout.tsx apps/web/src/app/(main)/[handle]/layout.tsx
src/app/(main)/[handle]/likes/likes-list.tsx apps/web/src/app/(main)/[handle]/likes/likes-list.tsx
src/app/(main)/[handle]/likes/page.tsx apps/web/src/app/(main)/[handle]/likes/page.tsx
src/app/(main)/[handle]/page.tsx apps/web/src/app/(main)/[handle]/page.tsx
src/app/(main)/[handle]/playlists/[rkey]/page.tsx apps/web/src/app/(main)/[handle]/playlists/[rkey]/page.tsx
src/app/(main)/[handle]/playlists/[rkey]/playlist-view.tsx apps/web/src/app/(main)/[handle]/playlists/[rkey]/playlist-view.tsx
src/app/(main)/[handle]/playlists/page.tsx apps/web/src/app/(main)/[handle]/playlists/page.tsx
src/app/(main)/[handle]/playlists/playlists-list.tsx apps/web/src/app/(main)/[handle]/playlists/playlists-list.tsx
src/app/(main)/[handle]/songs-list.tsx apps/web/src/app/(main)/[handle]/songs-list.tsx
src/app/(main)/layout.tsx apps/web/src/app/(main)/layout.tsx
src/app/(main)/page.tsx apps/web/src/app/(main)/page.tsx
src/app/.well-known/jwks.json/route.ts apps/web/src/app/.well-known/jwks.json/route.ts
src/app/auth/login/layout.tsx apps/web/src/app/auth/login/layout.tsx
src/app/auth/login/page.tsx apps/web/src/app/auth/login/page.tsx
src/app/favicon.ico apps/web/src/app/favicon.ico
src/app/globals.css apps/web/src/app/globals.css
src/app/layout.tsx apps/web/src/app/layout.tsx
src/app/oauth-client-metadata.json/route.ts apps/web/src/app/oauth-client-metadata.json/route.ts
src/app/oauth/callback/route.ts apps/web/src/app/oauth/callback/route.ts
src/app/oauth/login/route.ts apps/web/src/app/oauth/login/route.ts
src/app/oauth/logout/route.ts apps/web/src/app/oauth/logout/route.ts
src/components/avatar-section/avatar-section.tsx apps/web/src/components/avatar-section/avatar-section.tsx
src/components/avatar-section/index.tsx apps/web/src/components/avatar-section/index.tsx
src/components/avatar-section/logout-button.tsx apps/web/src/components/avatar-section/logout-button.tsx
src/components/pager/index.ts apps/web/src/components/pager/index.ts
src/components/pager/pager-link.tsx apps/web/src/components/pager/pager-link.tsx
src/components/pager/pager.tsx apps/web/src/components/pager/pager.tsx
src/components/player-bar/index.tsx apps/web/src/components/player-bar/index.tsx
src/components/player-bar/player-bar.tsx apps/web/src/components/player-bar/player-bar.tsx
src/components/player-bar/player-controls.tsx apps/web/src/components/player-bar/player-controls.tsx
src/components/player-bar/progress-bar.tsx apps/web/src/components/player-bar/progress-bar.tsx
src/components/player-bar/song-info.tsx apps/web/src/components/player-bar/song-info.tsx
src/components/playlist/actions.ts apps/web/src/components/playlist/actions.ts
src/components/playlist/add-to-playlist-dialog.tsx apps/web/src/components/playlist/add-to-playlist-dialog.tsx
src/components/playlist/delete-dialog.tsx apps/web/src/components/playlist/delete-dialog.tsx
src/components/playlist/edit-dialog.tsx apps/web/src/components/playlist/edit-dialog.tsx
src/components/playlist/index.tsx apps/web/src/components/playlist/index.tsx
src/components/playlist/playlist-card.tsx apps/web/src/components/playlist/playlist-card.tsx
src/components/playlist/playlist-menu.tsx apps/web/src/components/playlist/playlist-menu.tsx
src/components/playlist/playlist-schema.ts apps/web/src/components/playlist/playlist-schema.ts
src/components/playlist/remove-from-playlist-item.tsx apps/web/src/components/playlist/remove-from-playlist-item.tsx
src/components/song/actions.ts apps/web/src/components/song/actions.ts
src/components/song/delete-dialog.tsx apps/web/src/components/song/delete-dialog.tsx
src/components/song/edit-dialog.tsx apps/web/src/components/song/edit-dialog.tsx
src/components/song/edit-schema.ts apps/web/src/components/song/edit-schema.ts
src/components/song/index.tsx apps/web/src/components/song/index.tsx
src/components/song/interaction-actions.ts apps/web/src/components/song/interaction-actions.ts
src/components/song/share-popover.tsx apps/web/src/components/song/share-popover.tsx
src/components/song/song-menu.tsx apps/web/src/components/song/song-menu.tsx
src/components/song/song.tsx apps/web/src/components/song/song.tsx
src/components/song/upload-action.ts apps/web/src/components/song/upload-action.ts
src/components/song/upload-dialog.tsx apps/web/src/components/song/upload-dialog.tsx
src/components/song/upload-schema.ts apps/web/src/components/song/upload-schema.ts
src/components/theme-provider.tsx apps/web/src/components/theme-provider.tsx
src/components/theme-toggle.tsx apps/web/src/components/theme-toggle.tsx
src/components/ui/avatar.tsx apps/web/src/components/ui/avatar.tsx
src/components/ui/badge.tsx apps/web/src/components/ui/badge.tsx
src/components/ui/button.tsx apps/web/src/components/ui/button.tsx
src/components/ui/card.tsx apps/web/src/components/ui/card.tsx
src/components/ui/confirm-delete-dialog.tsx apps/web/src/components/ui/confirm-delete-dialog.tsx
src/components/ui/dialog.tsx apps/web/src/components/ui/dialog.tsx
src/components/ui/dropdown-menu.tsx apps/web/src/components/ui/dropdown-menu.tsx
src/components/ui/field.tsx apps/web/src/components/ui/field.tsx
src/components/ui/input.tsx apps/web/src/components/ui/input.tsx
src/components/ui/label.tsx apps/web/src/components/ui/label.tsx
src/components/ui/popover.tsx apps/web/src/components/ui/popover.tsx
src/components/ui/separator.tsx apps/web/src/components/ui/separator.tsx
src/components/ui/skeleton.tsx apps/web/src/components/ui/skeleton.tsx
src/components/ui/sonner.tsx apps/web/src/components/ui/sonner.tsx
src/components/ui/textarea.tsx apps/web/src/components/ui/textarea.tsx
src/components/ui/tooltip.tsx apps/web/src/components/ui/tooltip.tsx
src/hooks/use-cover-art-preview.ts apps/web/src/hooks/use-cover-art-preview.ts
src/hooks/use-interaction.ts apps/web/src/hooks/use-interaction.ts
src/lib/action-result.ts apps/web/src/lib/action-result.ts
src/lib/api.ts apps/web/src/lib/api.ts
src/lib/atproto.ts apps/web/src/lib/atproto.ts
src/lib/auth/client.ts apps/web/src/lib/auth/client.ts
src/lib/auth/session.ts apps/web/src/lib/auth/session.ts
src/lib/db/index.ts apps/web/src/lib/db/index.ts
src/lib/db/migrations.ts apps/web/src/lib/db/migrations.ts
src/lib/lexicons/index.ts packages/lexicons/src/index.ts
src/lib/lexicons/lexicons.ts packages/lexicons/src/lexicons.ts
src/lib/lexicons/types/app/musicsky/temp/comment.ts packages/lexicons/src/types/app/musicsky/temp/comment.ts
src/lib/lexicons/types/app/musicsky/temp/like.ts packages/lexicons/src/types/app/musicsky/temp/like.ts
src/lib/lexicons/types/app/musicsky/temp/playlist.ts packages/lexicons/src/types/app/musicsky/temp/playlist.ts
src/lib/lexicons/types/app/musicsky/temp/repost.ts packages/lexicons/src/types/app/musicsky/temp/repost.ts
src/lib/lexicons/types/app/musicsky/temp/song.ts packages/lexicons/src/types/app/musicsky/temp/song.ts
src/lib/lexicons/util.ts packages/lexicons/src/util.ts
src/lib/playlists.ts apps/web/src/lib/playlists.ts
src/lib/repo.ts apps/web/src/lib/repo.ts
src/lib/songs.ts apps/web/src/lib/songs.ts
src/lib/utils.ts apps/web/src/lib/utils.ts
src/scripts/gen-key.ts apps/web/src/scripts/gen-key.ts
src/scripts/migrate.ts apps/web/src/scripts/migrate.ts
src/stores/player-store.ts apps/web/src/stores/player-store.ts
src/types/playlist.ts apps/web/src/types/playlist.ts
src/types/song.ts apps/web/src/types/song.ts
+1 -1
tsconfig.json apps/web/tsconfig.json
··· 34 34 "**/*.mts", 35 35 "src/app/.well-known/**/*.ts" 36 36 ], 37 - "exclude": ["node_modules", "src/lib/lexicons"] 37 + "exclude": ["node_modules"] 38 38 }
+20
turbo.json
··· 1 + { 2 + "$schema": "https://turborepo.dev/schema.json", 3 + "tasks": { 4 + "build": { 5 + "dependsOn": ["^build"], 6 + "outputs": [".next/**", "!.next/cache/**"] 7 + }, 8 + "lint": { 9 + "dependsOn": ["^build"] 10 + }, 11 + "typecheck": { 12 + "dependsOn": ["^build"] 13 + }, 14 + "knip": {}, 15 + "dev": { 16 + "persistent": true, 17 + "cache": false 18 + } 19 + } 20 + }