PropertyPro

Changelog

What's new in PropertyPro

New updates and improvements to PropertyPro.

3.1.0

minor
August 18, 2026

Multi-Provider Storage, Application-to-Lease Linking & Billing Repair

Action required

Still storing files on the local disk? Point PropertyPro at a bucket before uploading anything new

3.1 retires the local-disk storage backend. Nothing is switched behind your back and nothing is deleted — files an earlier install wrote to public/uploads stay listed, viewable, and deletable — but new uploads are refused with a message pointing at Settings → Storage until you choose Cloudflare R2, AWS S3, DigitalOcean Spaces, or MinIO and press Test Connection. No database migration is required this release. Installs already on R2 keep working as they are, and only need the optional command below to move their saved credentials into the new per-provider settings block.

pnpm db:migrate-storage-providers --dry-run   # preview, writes nothing
pnpm db:migrate-storage-providers             # only if you already use R2
Read the file storage setup guide
Features
  • Storage on any S3-compatible provider — AWS S3, DigitalOcean Spaces, and MinIO join Cloudflare R2 in Settings → Storage, each keeping its own saved credentials behind its own Test Connection, so switching backends and switching back never means re-typing keys
  • Setup instructions for every provider built into the settings page — where to create the bucket, which keys to copy, and how to make it publicly readable, written out for R2, S3, Spaces, and MinIO instead of left to the documentation
  • STORAGE_* environment variables for installs configured from .env rather than the UI — STORAGE_PROVIDER, STORAGE_BUCKET, STORAGE_ACCESS_KEY_ID, STORAGE_SECRET_ACCESS_KEY, and STORAGE_PUBLIC_URL, plus STORAGE_ACCOUNT_ID, STORAGE_REGION, and STORAGE_ENDPOINT, with the existing R2_* names still honored as a fallback so no .env has to be edited
  • A lease now records the application it was drafted from, so the application page shows the lease it produced and the lease shows the screening behind it — including leases staff build by hand from an approved application
  • Applicants are told what was decided — approval and decline emails go out on the decision and carry the reviewer's note when there is one
Improvements
  • Deleting a property now declines its open applications and emails those applicants first, instead of leaving people waiting on an answer for a home that no longer exists, and reports how many were closed
  • Deleting a property also retires its documents, maintenance requests, and inspections, which used to be left behind as rows pointing at a property nobody could open — all soft-deleted, so restoring the property brings them back
  • Location search on the public site is a real control instead of the browser's native suggestion list, which the browser drew in operating-system chrome that can't be styled and which never showed which location the visitor had committed to — it now matches on every term typed and ticks the current choice
  • Removing a unit that a draft lease still points at is now refused rather than silently breaking that lease, and the message counts the units blocked by live leases separately from the ones blocked by drafts, so it is clear which need terminating and which need deleting
  • A lease date clash now names the lease already covering those dates instead of reporting a generic overlap, and the create and edit paths answer that question the same way
  • Every settings page now loads a placeholder shaped like the page that's coming — backups, email, maps, notifications, payment, profile, properties, and storage each had a generic five-field card standing in, so every section mounted through two visible jumps before the real form appeared
  • Wider settings column, and a storage provider grid that lays out on the card's own width rather than the browser window, so all four providers stay on one line with the required fields grouped first
  • The site root and the public property browser now answer a bad URL with the marketing design instead of the bare framework page
  • Creating and editing a property go through one save path, so a rejected save reports the same message from either page, and the property form is now the single definition of what gets submitted
  • Lease notification emails localized across Arabic, German, English, Spanish, and French
Fixes
  • Fixed a pending lease keeping the invoices it had before it was edited — a lease activated ahead of its start date generates its whole schedule and then waits at pending, where editing it neither rebuilt the schedule nor refused the edit, so those leases went active still billing the old rent, the old dates, and the old tenant; run db:reconcile-invoice-drift to find and repair leases already affected, a dry run by default
  • Fixed opening the prefilled lease form twice from one approved application creating two leases against the same applicant and unit
  • Fixed the lease form and the application approval path disagreeing about whether a unit was free, so a unit could be taken according to one and available according to the other — draft leases now count on both
  • Fixed the property status tiles counting a stored status field while every other screen in the app works the status out from the units, letting the dashboard totals silently disagree with the list right below them
  • Fixed the ticket list, My Tickets, and ticket detail pages crashing on a ticket whose author's account had since been deleted
  • Fixed saving a property from the edit page dropping its map coordinates, year built, video tour link, and attachments
  • Fixed leaving Year built blank blocking property creation with a validation error pointing at nothing
  • Fixed a property-level Features list that was accepted by the form and then discarded on save — property features are amenities, and unit features are the switches on each unit
  • Fixed one unreadable property breaking the whole maintenance and ticket request forms instead of being skipped
  • Fixed every upload path writing to Cloudflare R2 regardless of the configured provider — property photos, branding assets, avatars, tenant documents, and lease documents each talked to R2 directly, and lease document uploads additionally ignored credentials saved in Settings → Storage until the server was restarted
  • Fixed a failing storage provider silently writing to the local disk instead, which hid broken credentials behind uploads that appeared to succeed and stranded files on a single server
  • Fixed images failing to display on S3, Spaces, and MinIO because the image optimizer's allowed hosts were fixed at build time from the R2 setting alone
  • Fixed backups on any provider other than R2 archiving the database and project files but none of the uploaded media
  • Fixed an uploaded SVG logo being re-encoded to PNG but saved under its original .svg name, so branding rendered as a broken image

3.0.0

major
August 3, 2026

Public Website, Online Applications & Auth Rebuild

Action required

Upgrading from 2.x? Run the Better Auth migration before anyone signs in

3.0 moves authentication from NextAuth to Better Auth, which needs a one-time database migration. Until it runs, nobody can log in — every API call returns 503 and sign-in refuses even a correct admin password with "Invalid email or password". Passwords carry over untouched and no data is rewritten; everyone is simply signed out once. Back up first, then run it. Fresh installs can ignore this.

pnpm db:migrate-better-auth --dry-run   # preview, writes nothing
pnpm db:migrate-better-auth             # required before v3.0 boots
Read the v3.0 upgrade guide
Features
  • Public marketing website served from the same install — home page with hero search, a properties browser, property and unit detail pages, and a contact page, replacing the bare root redirect that used to send every visitor to sign-in
  • Online rental applications — prospective renters apply for a unit end to end through a four-step checkout collecting their details, requested lease terms, income, rental history, and screening consent, with no payment taken and nobody touching the dashboard
  • Applicants without an account register in the same pass — the checkout creates their tenant account from the submission, and both the confirmation screen and acknowledgement email explain that sign-in opens only once staff approve them
  • Live booking card on property and unit pages — move-in date, lease term (6/12/18/24 months), and adults, children, and pets counters recalculate an itemized move-in total, prorating the first month when the move-in date isn't the 1st
  • Approving a checkout application creates a DRAFT lease automatically, carrying the applicant's requested dates and the rent and deposit quoted at submission
  • Public Site module at Dashboard → Public Site — a master switch plus per-page switches for Home, Properties, Property detail, and Contact, with a switched-off page redirecting rather than 404ing
  • Five content editors put the public site's copy under admin control — brand and navigation, home hero and feature cards, properties headings, FAQ categories, and contact methods and form copy, plus per-page SEO title, meta description, and social share metadata
  • Contact inquiries inbox at Dashboard → Inbox → Inquiries — website messages arrive with an INQ- reference number, searchable and filterable by status and topic, with replies sent from the dashboard and kept as a thread on the record
  • Pluggable maps configured at Settings → Maps — OpenStreetMap (the default, needing no API key, Google Cloud account, or credit card), Google Maps, or no maps at all, stored in the database so switching providers needs no rebuild or redeploy
  • Address autocomplete on the property form fills street, city, state, ZIP, and country and captures coordinates, with a draggable pin to correct the location without touching the address text
  • Public property browser with a filter bar — location with suggestions, max rent, home type, and bedrooms, plus Pets OK and Available now chips, sorting, and a grid/list toggle, all held in the URL so a filtered view is shareable
  • Every filter option is computed from the live portfolio, so no picker can offer a choice that lands a visitor on an empty page, and a picker the portfolio can't fill hides itself
  • Unit-level public pages with the unit's own photos, specs, rent, deposit, and move-in date, a Lease this unit action, and a strip of sibling units to compare against
  • Video tours — one per property and optionally one per unit, accepting YouTube, Vimeo, or a direct video link — alongside a full-screen photo lightbox with thumbnails and keyboard navigation
  • Any lease that hasn't already ended can now be terminated — active, expired, pending, or pending-signature — from one shared dialog on the leases table, card grid, and detail page, with backdated, immediate, or scheduled end dates
  • Built-in Manager and Tenant roles are now editable; Administrator stays locked so the ability to undo a role change can never be removed
  • Per-row Edit, Cancel, and Delete actions plus bulk delete on the inspections list, each option hidden when the API would refuse it
  • Reset to defaults panel restores any single public-site section, or the whole public site, to the copy the app shipped with
Improvements
  • Authentication rebuilt on Better Auth — run db:migrate-better-auth once when upgrading; existing passwords keep working and the auth secret falls back to your current AUTH_SECRET or NEXTAUTH_SECRET, but everyone is signed out once because pre-3.0 logins have no server-side record to convert
  • Properties created before this release stay off the maps until you run db:backfill-coordinates to geocode their stored addresses — a dry run by default, and it needs a server-side Google geocoding key even on OpenStreetMap installs
  • Deleting records now requires its own permission — lease_delete, tenant_delete, payment_delete, document_delete, and user_delete are never implied by the matching edit grant, so the built-in Manager role ships without them until an admin grants them
  • Sign-in, registration, and password reset are rate limited for the first time — 10 sign-in attempts per 5 minutes, 5 registrations per hour, and 3 forgot-password requests per hour, per IP
  • Minimum password length raised from 6 to 8 characters, enforced identically across sign-up, reset, invitation setup, admin-created users, and change-password; existing passwords are unaffected
  • Leases stay editable for their whole life instead of drafts only — property, unit, and tenant freeze once the lease claims a unit, and rent and dates freeze only once invoices have actually been issued
  • Ended leases can now be deleted, taking their invoices, settled payments, security deposit, and documents with them as soft deletes stamped so an audit can tell them apart
  • Changing an active lease's rent or dates rebuilds its unbilled scheduled invoices in the same transaction and reports how many were replaced
  • Notifications and Announcements merged into a single Updates entry with a combined unread badge — the old URLs redirect, so existing links and stored notification targets keep working
  • Maintenance status actions behave identically from the detail page, the row menu, and the bulk endpoints — one permission check, one transition table, and one unit-status sync
  • Maintenance list moved to server-side pagination, search, filtering, and sorting instead of loading the whole collection into the browser, with summary cards counting the full dataset
  • Cards and skeletons across the dashboard, settings, and public pages drop their border in favor of a soft shadow, with shadows switched off entirely in dark mode
  • Tenant records are easier to enter and import — only Employer is required within the employment section, and the move-in date is no longer capped to a ±5-year window
  • A terminated tenant can be moved back into the pipeline so staff can re-lease to a past tenant, and the status dropdown no longer offers transitions the server will reject
  • Signed-out visitors to any dashboard page are returned to their original deep link after signing in, and signed-in visitors opening sign-in or sign-up go straight to the dashboard
  • Active session screens now report a single 24-hour window (Active today / Idle) to match how Better Auth records session activity
  • The whole app honours the operating system's reduce-motion setting, clamping animations and transitions to effectively zero
  • Package management switched from npm to pnpm, and the README now documents the real first-admin bootstrap — POST /api/setup/create-admin behind SETUP_SECRET — with a tracked .env.example and an UPGRADE.md covering migration, verification, and rollback
  • Localization updates for the Updates and Public Site navigation across Arabic, German, English, Spanish, and French
Fixes
  • Closed a hole where working demo administrator, manager, and tenant logins shipped in the product — the demo panel renders only under NEXT_PUBLIC_DEMO_MODE with passwords supplied per deployment, and seed:demo refuses to run in production; delete or reset those accounts if you ever ran it
  • Closed a privilege-escalation hole where a custom role named after a built-in alias (super_admin, landlord, owner, …) silently granted the full built-in permission set while the UI showed only the permissions that were picked
  • Changing a password now signs out every other device, as does an administrator resetting a user's password or a user completing the forgot-password flow
  • Deactivated, deleted, locked, and pending-application accounts are now refused on every sign-in method including Google and GitHub, not just email and password
  • Google and GitHub sign-in no longer provisions a working account on its own — an unknown address lands as a pending tenant application awaiting staff approval
  • Fixed rate limits and audit-log IP addresses being spoofable through a forged X-Forwarded-For header
  • Restricted session details so a property manager can no longer read an administrator's IP, device, and email by requesting a known session ID
  • Blocking, locking, or deactivating a user now ends that account's live sessions immediately instead of only refusing its next sign-in
  • Fixed emergency escalation failing on every attempt — the level always read back as 0, escalation history was discarded, and any escalation carrying a note failed outright
  • Fixed clearing a tenant's date of birth, SSN, employment info, emergency contacts, documents, or credit score reporting success while changing nothing
  • Fixed editing a lease silently wiping the terms the form doesn't display — pet deposit, utilities, restrictions, and payment config are now preserved
  • Fixed re-creating a tenant whose account was previously deleted failing with a duplicate-email error; existing databases can drop the legacy index with db:migrate-email-index
  • Fixed legacy leases created before lease numbers existed failing to save with "Lease number is required"
  • Fixed a lease getting permanently stuck reporting "A lease lifecycle operation is already in progress"
  • Restricted lease termination so tenants can no longer end their own tenancy
  • Fixed the maintenance list's This Week and This Month filters matching everything, and Priority sorting ordering alphabetically instead of by severity
  • Fixed bulk maintenance assign and status updates failing whenever a note was supplied, and photo attachments on the emergency request form failing to upload
  • Fixed cancelling an inspection overwriting the scheduling notes with the cancellation reason, and users holding a custom staff role being rejected as inspectors

2.3.0

major
July 22, 2026

Settings Platform, Media Library & Finance Hardening

Features
  • Self-service tenant onboarding — prospective tenants apply online with their personal, employment, and emergency-contact details, arriving in Tenants → Applications as pending applications for staff to review and approve
  • Applicants are held out of the app until an admin approves them: sign-in stays blocked while an application is pending or after it's been rejected
  • Storage settings with a Cloudflare R2 or local-disk provider and a built-in credential test
  • Searchable, paginated media library that indexes every upload across storage backends
  • Property Setup module — property types, unit types, amenities, and new-unit defaults are now admin-configurable instead of hardcoded
  • Security deposits and refunds accounting layer with real refunds and deposit returns across Stripe, PayPal, Paystack, and Razorpay
  • PDF, Excel, and CSV export for accounting reports and the tenants directory
  • Tenant email invitations — invite a tenant who then sets their own password
  • Application backup management
  • Settings change audit — every admin save leaves a secret-masked audit trail
  • Forgot, reset, and setup password pages with a "Forgot password?" link on sign-in
  • Active session tracking in user management, including sessions created before tracking existed
Improvements
  • Redesigned multi-section signup form capturing date of birth, employment (employer, position, income, start date), and an emergency contact, with 18+ age validation and all-or-nothing employment fields
  • Sign-in now shows a specific message for pending and rejected tenant applications instead of a generic error
  • Applications list merges self-service signups with property applications, always surfacing the newest signups first
  • Money handling rebuilt on pure, unit-tested algorithms covering revenue, invoices, late fees, refunds, and deposit accounting
  • Stronger lease lifecycle: transitions, overlap rules, termination, occupancy sync, late fees, and automatic invoicing
  • One reconciled gateway attempt per invoice across Stripe, PayPal, Razorpay, and Paystack
  • Database-level pagination and server-computed stats for users, properties, units, and listings
  • Properties details rebuilt as a slim header with tabs and a dedicated stats endpoint
  • Dashboard, financial reports, and transactions now count received cash the same way everywhere
  • Renamed Appearance settings to Branding, with the old route redirected
  • Removed the legacy duplicate settings stack for a smaller, cleaner codebase
  • Wider, redesigned create pages and refreshed sidebar, card, and analytics styling
  • Deposit collection wording clarified for offline (cash, check, ACH, bank transfer) payments
  • Localization updates across Arabic, German, English, Spanish, and French
Fixes
  • Fixed units disappearing from leases caused by unit IDs being regenerated on property edit
  • Fixed zero-decimal currencies (e.g. JPY) being overcharged 100x on Stripe and PayPal
  • Fixed a crash on tenant payment and receipt views from an ObjectId recursion bug
  • Closed a privilege-escalation hole that let self-registration create admin accounts
  • Added a last-admin safeguard so the final admin can't be demoted, deactivated, or deleted
  • Restricted admin pages and APIs with server-side guards; deleted users now lose access immediately
  • Custom roles now work end-to-end instead of being wrongly routed to the tenant dashboard
  • Tenant portal billing now derives dues from unpaid invoices, and receipt PDF download works
  • Fixed notifications, collapsible button, dynamic logo/business name, and email template data issues

2.2.0

major
June 30, 2026

Payment Gateways & Account Management

Features
  • PayPal, Razorpay, and Paystack integrations for payment collection
  • Password change, reset, and email verification management from the UI
  • SMTP setup and test tools in the admin dashboard
Improvements
  • Lease start date can now be set to a past date
  • Optimized delete behavior to keep finance data accurate
Fixes
  • Fixed PWA app icon and branding issue
  • Resolved dynamic favicon issue
  • Fixed full branding feature isolation issue
  • Replaced hardcoded user data with dynamic values
  • Synchronized system overview data

2.1.0

minor
June 19, 2026

Preference Settings & RTL Mode

Features
  • Dedicated preference settings, inspired by Storify
  • RTL (right-to-left) mode support
Improvements
  • Optimized RTL mode behavior across the app
  • Improved sidebar SVG chain design
  • Enhanced radio icon visibility in the sidebar
Fixes
  • Fixed apparent mode active color issue

2.0.0

major
April 23, 2026

Finance Module Development & Platform Enhancements

Features
  • PWA implementation for both online and offline usage
  • Support ticket system for better communication
  • Inspection features developed for admins
  • Push notifications for real-time updates
  • Full finance module
Improvements
  • Version upgrade from Next.js 15.5.9 to 16.2.1
  • Implemented React Compiler
  • Optimized package compatibility
  • Developed a dedicated notifications module in the communications department
  • Improved menu names and optimized submenu organization
  • Developed a dedicated announcements module
  • Enhanced tenant portal design for consistency with the admin portal
  • Updated sidebar design and improved behavior
  • Optimized stats card design
  • Redesigned chat interface
  • Improved real-time chat with SSE
  • Optimized toast error messages to show exact issues
  • Improved dashboard graph data accuracy
  • Implemented optional chaining across the application for better null and undefined data handling
Fixes
  • Resolved Stripe payment issue and updated payment status

1.4.0

major
January 8, 2026

Unit Management Module

Features
  • Dedicated unit management module with comprehensive controls
  • Unit images gallery with multiple photo support
  • Unit features and amenities management
  • Additional related information fields for units
  • Document upload capability during tenant creation
Improvements
  • Enhanced unit details page with better organization
  • Streamlined tenant onboarding workflow

1.3.0

minor
January 3, 2026

Design & Form Improvements

Improvements
  • Refined design elements across the application
  • Enhanced pagination with better user experience
  • Improved form layouts and input validation
  • Polished UI components for consistency
Fixes
  • Resolved tenant-related bug on payment creation page
  • Fixed form submission edge cases

1.2.0

major
December 16, 2025

Multi-lingual & UI/UX Enhancements

Features
  • Multi-lingual functionality with language switching
  • Dedicated navigation system for better UX
  • Individual pages for all property units
Improvements
  • UI/UX improvements across all modules
  • Enhanced visual consistency throughout the app
  • Better responsive design for mobile devices
  • Refined component styling and interactions
Fixes
  • Multiple bug fixes across the system
  • Improved error handling and validation

1.1.0

minor
November 4, 2025

Dark Mode & Roles Enhancement

Improvements
  • Enhanced dark mode with better contrast and readability
  • Improved roles management system
  • Refined color palette for both light and dark themes
  • Better accessibility across all pages
Fixes
  • Fixed image upload functionality issues
  • Resolved dark mode color inconsistencies
  • Corrected theme switching behavior

1.0.0

major
October 30, 2025

Initial Release

Features
  • Complete property management dashboard
  • Multi-unit property support with unlimited units
  • Tenant management with self-service portal
  • Lease creation and lifecycle management
  • Maintenance request system with work orders
  • Role-based access control (Admin, Manager, Tenant)
  • Document management with cloud storage
  • Responsive design with dark/light mode support
  • Email notifications system
  • Comprehensive reporting and analytics dashboard

Ready to get started?

Join hundreds of teams using PropertyPro to streamline their property workflow.