Press Tracker installation guide

Keep this guide open while installing. The same instructions are in INSTALLATION.txt.


PRESS TRACKER — SELF-HOSTED 1.0.0

Prepared November 14, 2026 for EntirelyDigital / cPanel


READ THIS FIRST

This is a ready-to-upload PHP application, not a Node.js server. The compiled

interface is included. You do not need Application Manager, npm, Composer, SSH,

or a build step to install it. Your existing ChatGPT-hosted app stays separate.

This package contains no existing stockroom data or passwords.


RECOMMENDED: use a dedicated subdomain such as inventory.yourdomain.com.

Use a new, empty database. Do not overwrite your online store's files/database.

You will create the owner's username/password during installation. Users do not

need ChatGPT accounts on this self-hosted version.


1. CREATE A SUBDOMAIN AND ENABLE HTTPS

In cPanel, open Domains and create the desired subdomain. Ask EntirelyDigital

to help if this option is not visible. Allow DNS to settle and enable SSL

(AutoSSL / SSL/TLS Status, depending on your cPanel layout).


Best folder arrangement:

/home/YOUR_CPANEL_USERNAME/press-tracker/

private/ configuration, protected photos and sessions

public/ ONLY this folder is your subdomain's document root

src/ source code; not needed by PHP at runtime

INSTALLATION.txt


In File Manager, upload the ZIP to your home directory (outside public_html),

then Extract it. The extracted folder is named press-tracker.

Set the subdomain document root to:

/home/YOUR_CPANEL_USERNAME/press-tracker/public


If cPanel requires document roots to be inside public_html, ask EntirelyDigital

to set a safe document root. Alternatively use public_html/press-tracker/public

as the document root AND keep the included private/.htaccess in place. The

public-only document root is preferred. Never make private/ the document root.

Enable “Show Hidden Files” in File Manager so .htaccess and .user.ini are kept.

Do not upload the ZIP, source backups or configuration into a public web folder.


2. SELECT PHP AND EXTENSIONS

Use Select PHP Version for this subdomain: PHP 8.3 or newer.

Required extensions: pdo_mysql, fileinfo, zip, session. JSON is built into PHP.

mbstring is recommended. MariaDB 11.4.13 is suitable; InnoDB must be available.

Apache/LiteSpeed must honor .htaccess and mod_rewrite.


Normal permissions: folders 755, files 644. PHP must be able to write to private/,

private/photos/ and private/sessions/. On typical cPanel PHP-FPM this works with

account ownership and 755. Do not use 777. Ask EntirelyDigital about ownership

if the installer reports a non-writable folder. Configuration/photo files are

written as 600 by the app; adjust ownership through support if necessary.


3. CREATE THE DATABASE

Open Manage My Databases (or Database Wizard).

- Create a dedicated, empty database, e.g. presstracker.

- Create a database user with a strong, unique password.

- Add that user to the new database and grant ALL PRIVILEGES on THAT DATABASE.

- Save the FULL prefixed names shown by cPanel, for example:

account_presstracker and account_ptuser

- Database host is usually localhost, port 3306. Confirm with EntirelyDigital

if they supply a different host or port.


The database user's password is different from the app owner's login password.

The app creates its own tables; no phpMyAdmin SQL import is normally necessary.


4. RUN THE INSTALLATION WIZARD

Open https://YOUR_SUBDOMAIN/install.php.

The wizard checks PHP extensions and writable folders.

Copy the installation key from private/setup-key.txt in the downloaded package

(or view it using cPanel File Manager). Keep this key private.

Enter the installation key, full database details and your desired owner name,

username, password and password confirmation. Passwords must be 12–72 bytes.

Click Install Press Tracker, then sign in.


The wizard writes private/config.php, removes the setup key, and locks itself.

After successful installation, delete public/install.php with File Manager.

Do not delete private/config.php. If setup fails midway after creating tables,

use a NEW empty database or ask support to clean up only this app's pt_ tables.

Never remove tables from your store's database.


5. BRING OVER YOUR CURRENT INVENTORY AND PHOTOS (OPTIONAL)

Your data is NOT embedded in this installation ZIP.

While signed into the current hosted app as the owner, open:

https://hotwife-fashions-stockroom.earthsprite.chatgpt.site/export

Click Download migration ZIP. Keep the page open until the download finishes.

Avoid editing inventory/photos while exporting. This is read-only and does not

change the hosted app. Download on a desktop if you have many photos.


On your new server: sign in as owner, choose Backups in the top bar, select the

migration ZIP under Import into an empty installation, type IMPORT, and import.

Inventory, photos, suppliers, saved categories/names, history and quantities

are included. User accounts/passwords are NOT transferred; recreate them below.

Import is refused if there are already inventory items OR photos in the new

installation. Import before entering new items or uploading new photos.


Use the same process with a self-hosted backup ZIP to restore to a new empty

installation. A migration ZIP must contain manifest.json plus photos/ files.

The app does not import CSV as a complete backup; CSV does not contain photos

or all settings. Keep migration ZIP files on your computer, not publicly online.


The included .user.ini requests 250 MB uploads, 260 MB POST and 512 MB memory.

Hosts may enforce lower limits or take several minutes to apply these values.

If upload/import is rejected, raise those limits in MultiPHP INI Editor / Select

PHP Options or ask EntirelyDigital. Individual photos remain limited to 6 MB.

The browser migration export limit is approximately 240 MB of photos; the import

limit is 250 MB uncompressed photos. Contact us before migrating a larger library.


6. ADD USERS

Open Users. Enter a display name, username, password and selected transfer

categories; use Tick all categories when appropriate. Save and send the person

your new subdomain link and their username. Share their password privately.

Additional users are view-only. They see blanks and permitted transfers/finished

items. Finished items require access to every source-transfer category.

New transfer categories are not granted automatically.

No categories checked means no transfers or finished items are visible.

Private/shared photos are protected on the server, including direct image links.

You can disable a user or enter a new password on their profile. Saving a user

invalidates their existing sessions. Users can change their own password under

Account. Only the installer-created owner can manage inventory and users.


7. VERIFY BEFORE SWITCHING OVER

- Add a test blank, transfer and premade item; confirm quantities/costs.

- Make an item and confirm both materials are deducted correctly.

- Confirm suppliers, on-order receiving, filters, printing and CSV work.

- Open a photo, check linked items and upload a replacement.

- Test a restricted user in a private/incognito browser window. Confirm private

transfers, finished items and photo URLs cannot be viewed.

- Test an inventory/photo backup download and keep it somewhere safe.

- Keep using ONLY ONE installation for stock changes after you switch over.

The self-hosted and ChatGPT-hosted databases do not synchronize.


BACKUPS AND UPDATES

Use Backups to download inventory/settings/history/photos regularly. This does

NOT include users/password hashes or configuration. Also enable daily cPanel

backups covering the MariaDB database and the entire press-tracker directory.

For full recovery you need BOTH the database and private/ folder, including

photos. Keep copies off the server. Session files need not be restored.


For updates, first back up the database and folder. Never overwrite/delete

private/config.php or private/photos/. Do not rerun install.php on an existing

installation. This first package has no automatic update mechanism.


FORGOTTEN OWNER PASSWORD

If you still have cPanel Terminal, run:

php /home/YOUR_CPANEL_USERNAME/press-tracker/private/reset-owner.php

Enter your owner username. It prints a temporary password; change it under

Account after signing in. This tool runs only from a terminal, not over the web.

If Terminal is unavailable, ask EntirelyDigital to run it for you. Never send

them your current password or paste the generated password into public tickets.


TROUBLESHOOTING

Blank page / error 500: check cPanel Errors and PHP logs. Confirm PHP >=8.3,

extensions, database permissions, and correct document root. The app deliberately

does not display database credentials in errors.

API not found / 404: keep public/.htaccess, enable mod_rewrite, confirm the public

folder is the document root. Do not put an extra public/ into the website URL.

Login loops / expired session: confirm HTTPS, writable private/sessions/, browser

cookies enabled and correct base_path in private/config.php. Don't access the

same installation through multiple domain names.

Uploads fail: check PHP upload/POST/memory limits and private/photos/ permissions.

Installer locked: this is normal after setup. Open the main domain to log in.

Images disappear for a user: review that user's transfer-category permissions;

a photo reused by a hidden item is intentionally hidden everywhere for that user.

Do not expose the private folder or relax permissions to troubleshoot.


SOURCE AND VALIDATION

Source is included under src/; PHP backend is in private/ and public/.

Optional developer rebuild: install Node.js on a development computer, run

npm install, then npm run build. Upload the resulting public/assets/app.js.

Node.js and npm are NOT required on the hosting server. React/ReactDOM and

Lucide notices are included under third-party/.


Validation: PHP syntax checked; integration tested with PHP 8.4.24 and MariaDB

11.8.6. Tests cover installation locking, username/password login, CSRF rejection,

revision conflicts, restricted categories/finished items/direct photos, replacing

photos, trash protection, backup/import roundtrip, refusal to overwrite non-empty

inventory and disabled-session revocation. The package uses PHP 8.3-compatible

syntax and standard MariaDB queries. Installation on your actual PHP 8.3 /

MariaDB 11.4.13 hosting account still needs the verification steps above.


Official reference guides

cPanel Database Wizard

cPanel File Manager

PHP PDO MySQL