Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
특별한 매물·임대 주택을 찾아보고, 동네 탐색·비교·관심 매물 저장까지 SOL Real Estate
Discover extraordinary homes for sale and rent. Explore neighborhoods, compare properties, and save the places you love with SOL Real Estate.
라이프스타일TypeScript · CSSGitHub @techvajoseph온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Real estate marketplace and member portal. Listings are scraped from Zillow and Redfin through HasData, stored in Supabase, and searched from there. HasData is never called on a user's page view.
Stack: Next.js 16 (App Router), Supabase (Postgres, Auth, RLS), Tailwind CSS v4, Vercel (hosting and cron).
1. Install: npm install
2. Supabase: create a project at supabase.com, then:
3. Env: cp .env.example .env.local and fill in the values.
4. Run: npm run dev and open http://localhost:3000
5. Make yourself admin: sign up in the app, then in the Supabase SQL editor run:README 전문 보기 ↗Real estate marketplace and member portal. Listings are scraped from Zillow and Redfin through HasData, stored in Supabase, and searched from there. HasData is never called on a user's page view.
Stack: Next.js 16 (App Router), Supabase (Postgres, Auth, RLS), Tailwind CSS v4, Vercel (hosting and cron).
Admin "Import" page ─┐
├─► runImport() ─► HasData /scrape/{zillow|redfin}/listing (paged)
Vercel Cron (daily) ─┘ │
├─► normalizeListing() → one schema for every provider
├─► upsert properties (dedupe on provider + provider_id)
└─► import_jobs log (pages, listings, credits, errors)
Visitors ─► /properties (filters in the URL) ─► Supabase (RLS: public read)
Members ─► /dashboard (favorites, saved searches; RLS: owner only)
| Path | Purpose |
|---|---|
src/lib/hasdata/client.ts | HasData REST client: x-api-key auth, timeout, retry on 429/5xx |
src/lib/hasdata/normalize.ts | Maps raw HasData listings to properties rows |
src/lib/hasdata/ingest.ts | Import pipeline: paging, upserts, job logging, scheduled sources |
src/app/api/admin/import | POST, admin-only one-off import |
src/app/api/cron/import | GET, re-runs all active import_sources (needs CRON_SECRET) |
src/lib/properties.ts | Marketplace search, filtering and sorting |
supabase/migrations/ | Schema and RLS policies |
npm installnpx supabase login
npx supabase link --project-ref <your-ref>
npm run db:push # applies supabase/migrations
cp .env.example .env.local and fill in the values.npm run dev and open http://localhost:3000update public.profiles set role = 'admin'
where id = (select id from auth.users where email = '[email protected]');
/admin/import, choose Zillow, enter "Austin, TX" with 1 page (costs 10 credits).HasData doesn't publish its response schema, so normalize.ts tries several likely field names. Pull a real sample and adjust the mappings to match:
npm run hasdata:sample -- zillow "Austin, TX" forSale
npm run hasdata:sample -- redfin "Austin, TX" forSale
Raw JSON is saved to samples/ (gitignored). The full raw listing is also stored in properties.raw, so data from earlier imports can be backfilled after a mapping changes.
http://localhost:3000/auth/confirm and your production URL./auth/confirm..env.example.vercel.json schedules /api/cron/import daily at 06:00 UTC. Vercel sends Authorization: Bearer $CRON_SECRET automatically.maxDuration = 300. Keep max_pages per source modest: each page is one HasData request taking roughly 5–20s.Each HasData listing request costs 10 credits, and every import job records credits_used.
Daily cron cost ≈ sum(max_pages of active sources) × 10 credits.
Zillow and Redfin restrict commercial redistribution of their listing data, and much of it is MLS-licensed. Get a legal review before publicly redisplaying scraped listings. An MLS/IDX feed is the compliant long-term source, and the provider column is there so one can be added alongside.
HasData's MCP server and agent skill let AI coding agents query HasData directly during development. They are not used at runtime.
claude mcp add --transport http hasdata "https://mcp.hasdata.com/mcp?apis=zillow,redfin" --header "x-api-key: <key>"
/dashboard: authenticated personal workspace with Buyer, Seller, and Landlord modes./dashboard/preview: public interactive sample workspace. Add ?role=buyer or ?role=landlord to open a particular preview. Preview edits are kept only in memory.Apply supabase/migrations/20261002020000_workspaces.sql after the existing migrations. It adds owner-scoped tables and row-level security; it does not modify imported marketplace inventory or platform admin roles. Workspace modes are self-selectable, while every record remains owned by its signed-in user.
Inventory records are private management records, not marketplace publications. Deals do not submit offers, and calendar plans do not contact agents or book external appointments. Rental collection, public listing publication, messaging, and electronic contracts are not connected.
Dashboard server actions validate inputs and authenticate each write. RLS also prevents cross-account access and restricts inventory writes to seller/landlord workspaces or existing agent/admin users. A sample workspace cannot write through the production actions.
Validation:
npm run lintnpm run buildnode --test scripts/dashboard-metrics.test.mjs (Node 22.18+ supports the TypeScript import)Design inspiration: the 21st.dev dashboard template collection and its sidebar / metric / table composition, adapted to SOL. Existing shadcn Button and Lucide icons are reused. No paid template was purchased or represented as installed.
Open /dashboard/preview?role=landlord for the interactive preview. Signed-in users select Landlord in their workspace selector; /dashboard/landlord also opens the dedicated dashboard when that role is selected.
Apply supabase/migrations/20261002030000_landlord_management.sql after the workspace migration to enable lease fields, owner-only deletion, and the rental ledger. This migration has passed local SQL/RLS checks but has not yet been applied to the hosted project. Management controls remain disabled until the schema is available.
The preview features the catalog rental at 77 Commercial St #2922S, Brooklyn. Tenant identities and financial history in the preview are illustrative. An empty authenticated portfolio offers a private draft copy of this rental; importing does not assert ownership or change the public catalog. Public publishing and payment collection are not connected.
Property deletion requires typing DELETE and cascades to the property's ledger. Recorded paid income and expenses drive the analytics; pending entries and future payments are excluded. Workspace changes never grant platform administrator access.
Additional checks: node scripts/landlord-metrics.test.mjs; local SQL validation of lease constraints, owner CRUD, cross-owner isolation, and ledger cascade; browser checks for property/ledger CRUD, calendar, reminders, chart filters, role switching, auth redirects, and 320/390/768/1440px layouts. No live tenant or account records were created for testing.