Reclaim · Lost & Found Management System

Reclaim is a self-hosted PHP and MySQL app for the lost property desk. Staff log found items with a photo and a QR label, Reclaim matches them with lost reports, tells the owner by email, WhatsApp or letter, and records a safe handover with an ID check, a signature and a PDF receipt. Items that nobody claims are disposed of with a certificate, and every step is in the audit log.

It is built for hotels, resorts, airports, shopping malls, universities, hospitals, stadiums, gyms and offices. It is plain PHP 8 with no framework, no Composer and no build step, so it runs on ordinary shared hosting.

What's new in 2.0

Server requirements

RequirementMinimum
PHP8.0 – 8.3
DatabaseMySQL 5.7+ or MariaDB 10.4+
PHP extensionsPDO, pdo_mysql, GD, fileinfo, mbstring (curl recommended for WhatsApp and AI)
Web serverApache with mod_rewrite (.htaccess included) or Nginx
Run locallyXAMPP, MAMP, Laragon, WampServer or any local PHP 8 + MySQL setup (see below)
OptionalSMTP mailbox, cron job, WhatsApp Business number, OpenAI or Gemini API key

Installation (web installer)

  1. Upload the contents of the package to your web root or a subfolder.
  2. Make these folders writable by the web server: config, uploads, storage.
    chmod -R 775 config uploads storage
  3. Open https://your-domain/install/ in a browser.
  4. Requirements: the installer checks PHP, extensions and folder permissions.
  5. Database: enter the host, database name, user and password. The database is created if it does not exist.
  6. Account: enter your organization name, admin email, password and timezone. Tick Install demo data to try Reclaim with sample items and photos.
  7. Done: delete the install folder and sign in.
Delete the install folder after setup. Reclaim refuses to reinstall while config/config.php exists, but removing the folder is the safe practice.

Running it on your own computer

Reclaim also runs locally, for trying it out, training staff or a single front-desk PC. With XAMPP (Windows, macOS, Linux), MAMP, Laragon or WampServer:

  1. Start Apache and MySQL in the control panel.
  2. Copy the Reclaim folder into the web root (htdocs for XAMPP and MAMP, www for Laragon and WampServer), for example htdocs/reclaim.
  3. Open http://localhost/reclaim/install/ and follow the installer. The default local database user is usually root with an empty password (MAMP: root / root).
Browsers only allow the camera on HTTPS or localhost, so QR scanning works locally on the same computer. To use it from phones on your network, set up HTTPS or use a real host.

Manual installation

  1. Create a utf8mb4 database and import install/sql/schema.sql.
  2. Optionally import install/sql/demo_data.sql and copy the photos in install/seed/items/ into both uploads/items/ and uploads/thumbs/.
  3. Copy config/config.sample.php to config/config.php and fill in the database details and APP_URL.
  4. Make uploads and storage writable.
Demo logins (with demo data):
Admin: admin@example.com / admin123
Staff: staff@example.com / staff123
Change or remove these accounts before going live.

Upgrading from 1.0

  1. Back up your files and database (your host's backup tool or phpMyAdmin export).
  2. Upload the new files over the old ones. Keep your config/config.php, uploads and storage folders. Do not upload the install folder.
  3. Open Reclaim in the browser. It shows the Upgrade screen because the database is older than the files.
  4. Sign in with an administrator email and password and click Upgrade. A safety backup of the database is made in storage/backups, then the upgrade runs.
  5. You are sent to the dashboard. All items, reports, handovers, users and settings are kept.

What changes in your data: finder and claimant contacts are split into separate email and phone fields (anything that looks like an email goes to email, the rest to phone), and the new tables and settings are added with safe defaults. New features such as WhatsApp, AI and returns by post stay off until you turn them on.

Prefer the command line? The upgrade SQL is core/migrations/2.0.0.sql. Import it once, then open the app; it records the new version itself.

After upgrading, set up the cron job, review Settings (new tabs: Matching & AI, Returns by post, Email & WhatsApp) and give the new manager or auditor role to anyone who needs it.

Scheduled tasks (cron)

Reclaim has background tasks: expiring stale lost reports, owner reminders and follow-ups, retrying failed emails, retention clean-up and backups. They run while people use the app (at most every 5 minutes), but for reliable timing add one of these to your server's cron every 5 minutes. System → Scheduled tasks shows both lines with your path and key filled in, with copy buttons.

*/5 * * * * php /path/to/reclaim/cron.php >/dev/null 2>&1
*/5 * * * * wget -q -O /dev/null "https://your-domain/cron.php?key=YOUR_KEY"

On cPanel use Cron Jobs and paste the line. Over the web the key is required; from the command line it is not. You can create a new key on the System page at any time. The page also shows when each task last ran and lets you run them now.

First-run setup

  1. Settings → General: organization name, timezone, date format, currency, language.
  2. Settings → Design: logo, brand colour and app icon.
  3. Sites and Storage locations: your premises and the shelves or cabinets in each.
  4. Categories: electronics, wallets, keys and so on, each with its own retention period.
  5. Users: add your team with the right role.
  6. Settings → Email & WhatsApp: connect SMTP so owners are told automatically.
  7. System: set up the cron job.

Interface basics

Found items

Found items → Log found item. Add a title, category, site and storage location, a photo (the phone camera opens on mobile), the finder's name, email and phone, and an estimated value. A reference such as F-2026-000123 is given automatically (sequential or random, see Settings → Items). An optional ownership question ("What is the lock screen picture?") helps you check the owner later.

Item statuses: in storage → matched → returned (to the owner), or returned to finder, or disposed. Matching, handovers and disposals can be undone if they were recorded by mistake.

Import

Found items → Import reads a CSV file from your old register. Download the template on that page, fill it in and upload it. Rows with errors are listed and skipped.

Return to finder

When nobody claims an item and the finder wants it, open the item and use Return to finder.

Trash

Deleted items go to the Trash and can be restored from the Found items list.

QR labels, scanner & storage map NEW

Chain of custody & holds NEW

Every item has a custody trail: logged, moved between shelves or sites, handed to a colleague, returned, posted or disposed, with the person and time for each step.

Place on hold (manager or admin) when the police, a court or an insurer asks you to keep an item. Enter the reason, a reference and an optional end date. While on hold, the item cannot be handed over, posted, returned to the finder or disposed of, and it is left out of disposal lists. Release the hold from the same page.

Lost reports

Staff log reports with Lost reports → Log lost report; owners can use the public form. Reports get a reference such as L-2026-000045.

StatusMeaning
openNot matched yet.
matchedLinked to a found item.
closedItem handed over, or closed by hand.
expiredOpen longer than the auto-expire period. Can be reopened.

Each report has a letter you can print and post to owners without email.

Matching

Reclaim compares every open lost report with every item in storage: category, colour, brand, words, place and date. Each pair gets a score from 0 to 100 with the reasons shown. Pairs above the minimum score appear in the Matches inbox; you confirm or dismiss them. Confirming links the two records and can email the owner. Matches are never confirmed automatically.

Settings → Matching & AI: minimum score and the date window. See AI features for the optional AI check.

Contacting owners NEW

Owners are told automatically at each step, by email and optionally WhatsApp:

MessageWhen
Report receivedA lost report is logged, with the reference and a private tracking link.
Possible matchA match is confirmed. The owner answers the ownership question from their phone.
Ready for pickupThe item is ready, with its photo and a pickup code.
Collection reminderBefore the holding period ends.
Still looking?Follow-ups on open reports on the days you choose.
ShippedA parcel is sent, with tracking.

Each message can be turned on or off in Settings → Email & WhatsApp. For owners without email, print the letter from the item or report; it has a QR code that opens the owner's private page.

Handover

From a found item, click Hand over to owner:

  1. Owner: name, email and phone (filled in from the lost report when matched).
  2. Identity: ID type and reference, an optional photo of the ID, the ownership answer and the pickup code.
  3. Second approval: items worth more than the high-value amount need a manager or admin to approve.
  4. Signature on screen (mouse, finger or stylus).

Confirming sets the item to returned, closes the report and creates a PDF receipt that can be emailed. What is required (ID, signature, pickup code) is set in Settings → Items & public pages. The Handovers register lists every return; a handover recorded by mistake can be voided.

Returns by post NEW

  1. Turn on Settings → Returns by post and set the default fee and payment instructions.
  2. The owner asks for delivery on their private page and enters the address, or staff use Send by post on the item.
  3. The shipment waits for payment. Record the payment (amount, method, reference, optional proof).
  4. Print the packing slip, send the parcel and enter the courier and tracking number.
  5. The owner is told by email and WhatsApp. Shipments lists everything waiting or in transit.

Retention & disposal

Each category can have its own retention period (or the default in Settings). Items past it appear on the Disposals page. Dispose of one item or select several for a batch, choose the method (donated, discarded, returned to finder, handed to the authorities) and print a certificate of disposal. Items on hold are never listed. Disposals can be edited or deleted, which returns the item to storage.

Reports & insights

Public pages

Each public page can be turned on or off in Settings → Items & public pages:

PageAddress
Front page/public/
Search found items (titles only, no private details)/public/search
Report a loss/public/report-lost
Found something?/public/found (reports wait for staff review)
Track a report/public/track-status

Forms are protected by a hidden honeypot field and a math question, and tracking lookups are rate-limited. Print a QR poster for each desk from Sites → Poster.

Email (SMTP)

Settings → Email & WhatsApp. Turn on email and enter your SMTP host, port, username, password and from-address, then use Send test. Common settings: port 465 (SSL) or 587 (STARTTLS). Emails use your logo and brand colour. Failed sends are retried by the scheduled tasks.

WhatsApp NEW

Reclaim sends WhatsApp messages through the official WhatsApp Business Cloud API from Meta, using your own business number. It is optional; email keeps working without it.

  1. In Meta's WhatsApp Manager, add a phone number and create a permanent access token.
  2. Create and get approval for the message templates you want to use. Each template takes three variables:
    Message{{1}}{{2}}{{3}}
    Report receivednamereferenceprivate link
    Possible matchnameitemprivate link
    Ready for pickupnamepickup codeprivate link
    Shippednamecourier and tracking numberprivate link
  3. In Reclaim, turn on Also message owners on WhatsApp, enter the phone number ID, the token, the template language, your country code (for local numbers) and the template names.
  4. Use the test form to send a template to your own phone.

AI features NEW

AI is optional and off by default. Reclaim works fully without it. It uses your own API key; nothing is sent until you turn it on.

Settings → Matching & AI: choose the provider (OpenAI, Google Gemini or any OpenAI-compatible API such as a local or third-party server), paste the API key and, if you like, the model. For compatible APIs also enter the base URL. Item photos and texts are sent to the provider you choose, so mention this in your privacy notice.

Payments

Reclaim does not process cards itself. For returns by post you choose how owners pay, in Settings → Returns by post:

Staff record the payment on the shipment when it arrives.

Settings

TabWhat it controls
GeneralName, language, timezone, date format, currency, rows per page, reference style, auto-expire days.
DesignLogo, app icon, brand colour.
Items & public pagesRetention, ID / signature / pickup code at handover, high-value amount, staff disposals, public pages.
Matching & AIMinimum match score, date window, AI provider and features.
Returns by postOn/off, default fee, payment instructions, link and QR.
Privacy & securityPersonal data retention, audit log retention, session timeout, password rules, GDPR requests.
Email & WhatsAppSMTP, which messages are sent, follow-ups, WhatsApp.

Roles & permissions

Can…AdminManagerStaffAuditor
Log and edit items, reports, matches, handovers, shipments✓✓✓view only
Approve high-value handovers, place holds✓✓––
Manage sites, locations, categories✓✓––
Dispose of items✓✓if allowed–
Reports, insights and audit log✓✓reports✓
Users, settings, system✓–––

The last active administrator cannot be removed or demoted.

Security & privacy

System, backups & health

System (admin only) has a health check (PHP, extensions, folders, email, cron), the scheduled tasks, database backups (make, download, restore; one is made automatically before each upgrade), the PHP error log and maintenance mode, which shows a notice to everyone except admins.

Customization & languages

Demo mode

Setting define('DEMO_MODE', true); in config/config.php shows a demo banner and the demo logins, and locks secret settings (email, WhatsApp and AI keys). Leave it false for a real installation.

FAQ & troubleshooting

Blank page or error 500

Check the database details in config/config.php and look at System → Error log or your host's PHP error log.

Pages other than the home page show "Not found"

Apache's mod_rewrite is off or .htaccess was not uploaded (it is a hidden file). On Nginx add the try_files rule above.

Photos will not save

Make uploads and storage writable (chmod -R 775) and check the photo is JPG, PNG or WebP under 5 MB.

Email is not sending

Use Send test in Settings → Email & WhatsApp; the error from your mail server is shown. Try port 465 with SSL or 587 with STARTTLS, and use the full mailbox address as the username.

WhatsApp test fails

Check the token has not expired (use a permanent system-user token), the template name and language match exactly what Meta approved, and the number includes the country code.

Reminders and follow-ups are not sent

Set up the cron job. System → Scheduled tasks shows when each task last ran.

The camera does not open for scanning

Browsers only allow the camera on HTTPS. Install an SSL certificate (free with Let's Encrypt on most hosts).

The site shows the Upgrade screen

The files are newer than the database. Sign in on that screen as an administrator and click Upgrade.

"Already installed" on the installer

Reclaim is installed. Delete the install folder. To start over, delete config/config.php first.

Changelog

2.0.0

1.0.0

Credits

Bundled open-source components (Bootstrap, Bootstrap Icons, jQuery, Chart.js, Dompdf, PHPMailer, jsQR, qrcode-generator, Signature Pad, Inter font) and their licenses are listed in licenses/index.html. The demo photos are public domain (CC0) and listed in install/seed/items/CREDITS.txt.

Support

Use the support tab on the item's CodeCanyon page. Please include your PHP and MySQL versions, the Reclaim version (shown on the System page) and any error message.