{"id":50544027,"url":"https://github.com/blordeus/tech-conference-site","last_synced_at":"2026-06-03T22:30:26.605Z","repository":{"id":357027061,"uuid":"1234299849","full_name":"blordeus/tech-conference-site","owner":"blordeus","description":"Multi-page tech conference site with schedule filtering, saved talks, GitHub OAuth, and Sanity CMS. Built with Next.js 16, Neon (Postgres), and NextAuth.","archived":false,"fork":false,"pushed_at":"2026-05-11T01:44:14.000Z","size":1275,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-11T02:27:25.615Z","etag":null,"topics":["frontend-mentor","full-stack","neon","nextauth","nextjs","postgres","react","sanity","tailwindcss","typescript","vercel"],"latest_commit_sha":null,"homepage":"https://tech-conference-site.vercel.app","language":"JavaScript","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/blordeus.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-10T02:13:45.000Z","updated_at":"2026-05-11T01:55:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/blordeus/tech-conference-site","commit_stats":null,"previous_names":["blordeus/tech-conference-site"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/blordeus/tech-conference-site","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blordeus%2Ftech-conference-site","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blordeus%2Ftech-conference-site/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blordeus%2Ftech-conference-site/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blordeus%2Ftech-conference-site/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/blordeus","download_url":"https://codeload.github.com/blordeus/tech-conference-site/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blordeus%2Ftech-conference-site/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33883102,"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":"online","status_checked_at":"2026-06-03T02:00:06.370Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["frontend-mentor","full-stack","neon","nextauth","nextjs","postgres","react","sanity","tailwindcss","typescript","vercel"],"created_at":"2026-06-03T22:30:23.355Z","updated_at":"2026-06-03T22:30:26.598Z","avatar_url":"https://github.com/blordeus.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DevHorizon 26\n\nA multi-page tech conference site built with Next.js 16, Sanity CMS, NextAuth, and Neon (Postgres).\n\nLive: [coming soon]\n\n---\n\n## What it does\n\n- Browse speakers, filter the schedule by day and track, and save talks to a personal schedule\n- Saved talks persist to a Postgres database when signed in, localStorage when not\n- Export saved talks as a `.ics` file for Google Calendar or iCal\n- Filter state syncs to the URL — shareable links work out of the box\n- Content is managed through an embedded Sanity Studio at `/sanity`\n\n---\n\n## Stack\n\n| Layer | Tool |\n|---|---|\n| Framework | Next.js 16 (App Router) |\n| Styling | Tailwind CSS 4 |\n| CMS | Sanity v3 |\n| Auth | NextAuth.js (GitHub OAuth) |\n| Database | Neon (Postgres) |\n| Deployment | Vercel |\n\n---\n\n## Pages\n\n- `/` — Home: keynote hero, tracks, featured speakers, schedule highlights\n- `/schedule` — Full schedule with day/track/saved filters and .ics export\n- `/speakers` — Speaker grid with modal bio and talk save\n- `/sanity` — Embedded Sanity Studio\n\n---\n\n## Local setup\n\n**1. Clone and install**\n\n```bash\ngit clone https://github.com/blordeus/tech-conference-site\ncd tech-conference-site\nnpm install\n```\n\n**2. Environment variables**\n\nCreate `.env.local` in the project root:\n\n```dotenv\n# Sanity\nNEXT_PUBLIC_SANITY_PROJECT_ID=your_project_id\nNEXT_PUBLIC_SANITY_DATASET=production\nNEXT_PUBLIC_SANITY_API_VERSION=2024-01-01\n\n# Neon\nDATABASE_URL=your_neon_connection_string\n\n# NextAuth\nNEXTAUTH_SECRET=your_secret\nNEXTAUTH_URL=http://localhost:3000\nGITHUB_CLIENT_ID=your_github_client_id\nGITHUB_CLIENT_SECRET=your_github_client_secret\n```\n\n**3. Run**\n\n```bash\nnpm run dev\n```\n\nOpen `http://localhost:3000`.\n\n---\n\n## Database\n\nOne table in Neon:\n\n```sql\nCREATE TABLE saved_talks (\n  id SERIAL PRIMARY KEY,\n  user_id TEXT NOT NULL,\n  talk_id TEXT NOT NULL,\n  created_at TIMESTAMP DEFAULT NOW(),\n  UNIQUE(user_id, talk_id)\n);\n```\n\n---\n\n## Content\n\nContent is managed in Sanity. Four document types: `conference`, `track`, `speaker`, `talk`.\n\nTo access the Studio locally: `http://localhost:3000/sanity`\n\nTo migrate content from `data.json`:\n\n```bash\n$env:SANITY_TOKEN=\"your_token\"\nnode scripts/migrate-to-sanity.mjs\n```\n\nTo upload speaker avatars:\n\n```bash\n$env:SANITY_TOKEN=\"your_token\"\nnode scripts/upload-avatars.mjs\n```\n\n---\n\n## Project structure\n\n```\napp/\n  page.jsx              ← Home\n  schedule/page.jsx     ← Schedule\n  speakers/page.jsx     ← Speakers\n  sanity/[[...tool]]/   ← Embedded Studio\n  api/\n    auth/[...nextauth]/ ← NextAuth\n    saves/              ← Save/unsave talks\ncomponents/\n  home/                 ← KeynoteHero, TracksSection, FeaturedSpeakers, ScheduleHighlights\n  schedule/             ← ScheduleClient, ScheduleFilters, ScheduleList\n  speakers/             ← SpeakersClient, SpeakerGrid, SpeakerModal\n  shared/               ← TalkTicket (used across all three pages)\nhooks/\n  useSavedTalks.js      ← DB when signed in, localStorage when not\n  useScheduleFilters.js ← Filter state synced to URL\nlib/\n  sanity.js             ← Sanity client + GROQ queries\n  data.js               ← Data access layer (wraps sanity.js)\n  db.js                 ← Neon connection\n  savedTalks.js         ← DB queries for saved talks\n  ics.js                ← .ics export\nscripts/\n  migrate-to-sanity.mjs ← One-time data migration\n  upload-avatars.mjs    ← One-time avatar upload\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblordeus%2Ftech-conference-site","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblordeus%2Ftech-conference-site","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblordeus%2Ftech-conference-site/lists"}