Skip to main content

Qroperty

Turn property addresses into trackable QR codes and short links for real estate professionals.

Status

StatusActive
TypePersonal Project
Version0.20.0

Overview

Qroperty helps real estate professionals create memorable short links and QR codes for property listings with built-in analytics to track engagement. Agents can create custom slugs like qroperty.link/123-main-street and generate high-resolution QR codes for print materials, window displays, and business cards.

Key Features

Property Links

  • Short, memorable links from property addresses
  • Custom slugs with permanent IDs (QR codes stay valid even if slugs change)

QR Codes

  • Auto-generated high-resolution codes for every link
  • Download in PNG or SVG format

Analytics Dashboard

  • Track total scans and views over time
  • Device breakdown (mobile, tablet, desktop)
  • Geographic location tracking (country and city)
  • Top-performing properties

User Management

  • Email/password authentication with verification
  • Password reset via email

Subscriptions

  • Free: 5 property links, basic analytics
  • Pro: 50 property links, full analytics, priority support
  • Team: Coming soon

Admin Dashboard

  • User management (super admins only)
  • Ban/unban users
  • System-wide statistics

Tech Stack

  • Frontend: Next.js 16, React 19, Tailwind CSS 4
  • Backend: Convex (real-time serverless database)
  • Payments: Stripe
  • Email: Resend

Setup & Development

# Clone and install
git clone https://github.com/sphereboy/qroperty.git
cd qroperty
npm install

# Set up environment variables
cp env.example .env.local
# Fill in Convex, Stripe, and Resend credentials

# Start development (two terminals)
npx convex dev # Terminal 1: Convex backend
npm run dev # Terminal 2: Next.js frontend

Open http://localhost:3000

Scripts

npm run dev      # Start Next.js dev server
npm run build # Production build
npm run lint # Run ESLint
npx convex dev # Start Convex dev server
npx convex push # Deploy Convex to production

Architecture

Dual-View Architecture

The app has separate desktop and mobile views:

  • Desktop views: app/ pages wrapped in AppLayout
  • Mobile views: components/mobile/ (rendered when viewport < 640px)

Key mobile components:

  • MobileHome - Dashboard home
  • MobileSettings - Settings with drill-down navigation
  • MobileAnalytics - Analytics view
  • QRCardStack / QRFullScreen - QR code views

Convex Backend

All backend logic lives in the convex/ directory. Key conventions:

  • Function types: query, mutation, action (public) and internal* variants (private)
  • Database: Always use .withIndex() instead of .filter() for queries
  • Actions: For external API calls (Stripe, Resend), use "use node"; directive

Git Conventions

Uses commitlint with conventional commits:

type(scope): description

Types: feat, fix, chore, docs, style, refactor, test, perf


Handoff Notes

Environment Variables

Required credentials for Convex, Stripe, and Resend. See env.example for the full list.