{"id":50241056,"url":"https://github.com/clonephaze/bookshelf---clonecore","last_synced_at":"2026-05-26T21:04:18.937Z","repository":{"id":349826990,"uuid":"1195940715","full_name":"Clonephaze/BookShelf---Clonecore","owner":"Clonephaze","description":"A frontend mentor challenge taken to the full stack","archived":false,"fork":false,"pushed_at":"2026-04-07T18:26:14.000Z","size":709,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-07T19:23:53.190Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://bookshelf-clonecore.vercel.app","language":"Vue","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/Clonephaze.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":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-30T08:03:44.000Z","updated_at":"2026-04-07T18:26:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Clonephaze/BookShelf---Clonecore","commit_stats":null,"previous_names":["clonephaze/bookshelf---clonecore"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Clonephaze/BookShelf---Clonecore","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Clonephaze%2FBookShelf---Clonecore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Clonephaze%2FBookShelf---Clonecore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Clonephaze%2FBookShelf---Clonecore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Clonephaze%2FBookShelf---Clonecore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Clonephaze","download_url":"https://codeload.github.com/Clonephaze/BookShelf---Clonecore/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Clonephaze%2FBookShelf---Clonecore/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33538684,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"ssl_error","status_checked_at":"2026-05-26T15:22:15.568Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":[],"created_at":"2026-05-26T21:04:06.052Z","updated_at":"2026-05-26T21:04:18.932Z","avatar_url":"https://github.com/Clonephaze.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bookshelf\n\n**Every book tells a story. Yours starts here.**\n\nA full-stack reading tracker built as a [Frontend Mentor](https://www.frontendmentor.io) Product Challenge. Search for books, organize them into shelves, track reading progress, set goals, time reading sessions, and explore rich year-in-review statistics.\n\n**Live:** [bookshelf-clonecore.vercel.app](https://bookshelf-clonecore.vercel.app)\n\n---\n\n## Features\n\n- **Library \u0026 Shelves** — Organize books into default and custom shelves with drag-and-drop, sorting, and cover art\n- **Book Search** — Dual-API search (Open Library + Google Books) with ISBN support, deduplication, and progressive cover enhancement\n- **Reading Progress** — Page-by-page tracking with visual indicators, milestone celebrations, and completion prompts\n- **Reading Goals** — Yearly, monthly, and weekly targets with pace tracking (ahead / on track / behind)\n- **Reading Sessions** — Timed sessions with pause/resume, ambient mode, pages-per-hour stats, and streak tracking\n- **Statistics Dashboard** — Monthly charts, genre breakdown, rating distribution, reading heatmap, pace trends, and author diversity\n- **Year in Review** — Narrative storytelling experience with shareable cards (Canvas API image generation)\n- **Discover** — \"Because you read…\" recommendations via collaborative filtering, genre affinity, and author connections\n- **Friends** — Lightweight social layer with username search, activity feeds, and privacy controls\n- **Goodreads Import** — Full CSV parsing with fuzzy matching, conflict resolution, and import statistics\n- **Guest Mode** — One-click demo with 45 pre-seeded books across shelves, ratings, progress, and goals\n- **Progress Intelligence** — Pace projections, finish-date estimates, stale book detection, and contextual nudges\n- **Command Palette** — Ctrl+K quick navigation and library search\n- **PWA** — Installable with offline shell, service worker caching for covers and fonts\n\n## Accessibility\n\n- WCAG AAA high contrast mode\n- Dyslexia-friendly font option (Atkinson Hyperlegible)\n- Customizable font size and line height\n- Color-blind safe mode\n- Full keyboard navigation\n- Skip links, ARIA landmarks, and live regions\n- `prefers-reduced-motion` respected throughout\n\n## Tech Stack\n\n| Layer | Choice |\n|-------|--------|\n| **Framework** | Nuxt 4 (Vue 3.5, Nitro 2, TypeScript strict) |\n| **Styling** | SCSS + CSS custom properties |\n| **Auth** | Better Auth (email + password, session-based) |\n| **Database** | PostgreSQL via Neon (serverless) |\n| **ORM** | Drizzle ORM |\n| **Book APIs** | Open Library (primary) + Google Books (enrichment/fallback) |\n| **Hosting** | Vercel (SSR) |\n| **Icons** | Lucide Vue |\n| **Testing** | Vitest + @nuxt/test-utils + @vue/test-utils |\n| **PWA** | @vite-pwa/nuxt |\n\n## Lighthouse Scores\n\n| Page | Performance | Accessibility | Best Practices | SEO |\n|------|:-----------:|:------------:|:--------------:|:---:|\n| Landing | 97 | 91 | 100 | 100 |\n| Library | 93 | 96 | 100 | 100 |\n| Discover | 99 | 94 | 100 | 100 |\n\n## Themes\n\nThree built-in themes plus system auto-detection:\n\n- **Light** — Warm sepia-parchment\n- **Dark** — Deep espresso\n- **OLED** — True black\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 20+\n- PostgreSQL database ([Neon](https://neon.tech) recommended)\n\n### Setup\n\n```bash\ngit clone \u003crepo-url\u003e\ncd bookshelf\nnpm install\n```\n\nCreate a `.env` file:\n\n```env\nDATABASE_URL=postgresql://...\nBETTER_AUTH_SECRET=your-secret-here\nBETTER_AUTH_URL=http://localhost:3000\nGOOGLE_BOOKS_API_KEY=your-key        # optional, enriches search results\n```\n\nPush the database schema:\n\n```bash\nnpx drizzle-kit push\n```\n\n### Development\n\n```bash\nnpm run dev\n```\n\n### Testing\n\n```bash\nnpm run test:run    # single run\nnpm run test        # watch mode\n```\n\n### Production Build\n\n```bash\nnpm run build\nnpm run preview\n```\n\n## Project Structure\n\n```\napp/\n├── assets/scss/     # SCSS: variables, themes, mixins, animations\n├── components/      # Vue components (BookCover, BookGrid, ShareCardModal, …)\n├── composables/     # Shared logic (useTheme, useAppearance, useShareCard, …)\n├── layouts/         # default, auth, landing\n├── middleware/       # Route guards (auth, guest)\n├── pages/           # File-based routing\n├── plugins/         # Auth watcher, appearance init\n├── stores/          # Pinia stores (library, session, import)\n└── utils/           # Helpers (avatars, formatting)\nserver/\n├── api/             # Nitro API routes\n├── database/        # Drizzle schema + connection\n├── middleware/       # Server auth middleware\n└── services/        # Book API adapters, search service\ndocs/                # Architecture, database, API strategy, decisions\nspec/                # Product definition, requirements, differentiators\nguidance/            # Brand kit, UI patterns, accessibility checklist\n```\n\n## License\n\nThis project was built as a learning exercise for the Frontend Mentor Product Challenge.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclonephaze%2Fbookshelf---clonecore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclonephaze%2Fbookshelf---clonecore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclonephaze%2Fbookshelf---clonecore/lists"}