A website inspired by Last.fm that will keep track of your listening statistics
lastfm music statistics
0
fork

Configure Feed

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

clean directory

oscar345 78f1efb5 60e9b938

+72 -83
-42
client/README.md
··· 1 - # sv 2 - 3 - Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). 4 - 5 - ## Creating a project 6 - 7 - If you're seeing this, you've probably already done this step. Congrats! 8 - 9 - ```sh 10 - # create a new project 11 - npx sv create my-app 12 - ``` 13 - 14 - To recreate this project with the same configuration: 15 - 16 - ```sh 17 - # recreate this project 18 - npx sv create --template minimal --types ts --add tailwindcss="plugins:forms" --install npm client 19 - ``` 20 - 21 - ## Developing 22 - 23 - Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 24 - 25 - ```sh 26 - npm run dev 27 - 28 - # or start the server and open the app in a new browser tab 29 - npm run dev -- --open 30 - ``` 31 - 32 - ## Building 33 - 34 - To create a production version of your app: 35 - 36 - ```sh 37 - npm run build 38 - ``` 39 - 40 - You can preview the production build with `npm run preview`. 41 - 42 - > To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.
client/better-auth_migrations/2026-01-23T18-48-25.942Z.sql private/migrations/auth/create_auth.sql
+32 -16
client/src/lib/components/layout/app/Navigation.svelte
··· 37 37 ]); 38 38 </script> 39 39 40 + {#snippet link(item: NavigationItemProps)} 41 + <a 42 + href={item.href} 43 + aria-current={item.pathname && page.url.pathname.startsWith(item.pathname) 44 + ? "page" 45 + : undefined} 46 + > 47 + {#if item.icon} 48 + <Icon name={item.icon} /> 49 + {/if} 50 + {item.label} 51 + </a> 52 + {/snippet} 53 + 40 54 <nav> 41 55 <a href="/" class="logo"> 42 56 <Logo /> ··· 44 58 <ul> 45 59 {#each primary as item} 46 60 <li> 47 - <a 48 - href={item.href} 49 - aria-current={item.pathname && 50 - page.url.pathname.startsWith(item.pathname) 51 - ? "page" 52 - : undefined} 53 - > 54 - {#if item.icon} 55 - <Icon name={item.icon} /> 56 - {/if} 57 - {item.label} 58 - </a> 61 + {@render link(item)} 59 62 </li> 60 63 {/each} 61 64 </ul> 62 65 63 - <div class="avatar"> 66 + <div class="bottom"> 67 + <ul> 68 + <li> 69 + {@render link({ 70 + label: "Settings", 71 + icon: "hero-cog-6-tooth-solid", 72 + href: "/app/settings", 73 + pathname: "/app/settings", 74 + })} 75 + </li> 76 + </ul> 64 77 <Avatar /> 65 78 </div> 66 79 </nav> ··· 70 83 grid-area: logo; 71 84 } 72 85 73 - .avatar { 74 - grid-area: avatar; 86 + .bottom { 87 + grid-area: bottom; 88 + display: flex; 89 + flex-direction: column; 90 + gap: var(--spacing-4); 75 91 } 76 92 77 93 nav { ··· 79 95 padding-inline: var(--spacing-4); 80 96 display: grid; 81 97 row-gap: var(--spacing-4); 82 - grid-template-areas: "logo" "primary" "." "avatar"; 98 + grid-template-areas: "logo" "primary" "." "bottom"; 83 99 padding-block: var(--spacing-4); 84 100 grid-template-rows: max-content max-content 1fr max-content; 85 101 }
+25
client/src/routes/app/settings/+page.svelte
··· 1 + <script lang="ts"> 2 + type Props = {}; 3 + 4 + let {}: Props = $props(); 5 + </script> 6 + 7 + <main> 8 + <header class="header"> 9 + <hgroup> 10 + <h1 class="h1">Settings</h1> 11 + <p class="subtitle"> 12 + Lorem ipsum dolor sit amet consectetur adipisicing elit. Velit eos, 13 + nemo accusantium a, perspiciatis distinctio modi quisquam sequi 14 + consectetur alias consequuntur tempora illo placeat ipsum 15 + necessitatibus ab delectus at commodi. 16 + </p> 17 + </hgroup> 18 + </header> 19 + </main> 20 + 21 + <style> 22 + main { 23 + padding: var(--spacing-6); 24 + } 25 + </style>
+7 -7
client/svelte.config.js
··· 1 - import adapter from '@sveltejs/adapter-auto'; 1 + import adapter from "@sveltejs/adapter-auto"; 2 2 3 3 /** @type {import('@sveltejs/kit').Config} */ 4 4 const config = { 5 - kit: { 6 - // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. 7 - // If your environment is not supported, or you settled on a specific environment, switch out the adapter. 8 - // See https://svelte.dev/docs/kit/adapters for more information about adapters. 9 - adapter: adapter() 10 - } 5 + kit: { 6 + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. 7 + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. 8 + // See https://svelte.dev/docs/kit/adapters for more information about adapters. 9 + adapter: adapter(), 10 + }, 11 11 }; 12 12 13 13 export default config;
+8 -18
taskfile.yml
··· 79 79 - task: seed.stats 80 80 - duckdb private/database/statistics.dev.duckdb < scripts/seeds/statistics.sql 81 81 82 - watch:css: 83 - dir: web 84 - cmd: npm run watch:css 85 - 86 - build:css: 87 - dir: web 88 - cmd: npm run build:css 89 - 90 - watch:js: 91 - dir: web 92 - cmd: npm run watch:js 82 + run:client: 83 + dir: client 84 + cmd: npm run dev 93 85 94 - build:js: 95 - dir: web 96 - cmd: npm run build:js 86 + build:client: 87 + dir: client 88 + cmd: npm run build 97 89 98 90 build:*: 99 91 cmd: go build -o bin/{{ index .MATCH 0 }} cmd/{{ index .MATCH 0 }}/main.go ··· 122 114 sources: 123 115 - "{internal,pkg}/**/*.go" 124 116 deps: 125 - - task: watch:css 126 - - task: watch:js 117 + - task: run:client 127 118 - task: run:server 128 119 cmd: echo "serving" 129 120 130 121 build: 131 122 cmds: 132 - - task: build:css 133 - - task: build:js 123 + - task: build:client 134 124 - task: build:server