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.