Customise how this install looks, and manage the API connections it uses.
Branding
Colours and font apply across the whole site, including the public Credits Board and Client CV pages.
Ready-Made Themes
Page
Header
Main Menu
Fields, Tables & Panels
Buttons
Header Buttons
Replaces the Fortan Software logo in the top-left of the header on every page. The header gives it 64px of height and scales the width to match, so a wide image about 400 × 128px is the sweet spot — that is 64px at double resolution, so it stays sharp on a retina screen. A PNG with a transparent background sits best on the dark header. PNG, JPEG, GIF or WEBP, up to 2MB.
Licence
Your licence key, from whoever you bought this from. The key itself is checked
here on your own server. Saving it also registers this domain with the licence
server once -- after that the app keeps working whether or not that server can
be reached.
Checking...
Activation
—
Video Portfolio
How the public portfolio grid is laid out. Narrow screens always drop to fewer columns than this, so a phone still gets one tile per row.
Storage
Where files delivered to clients are held, and how long they stay before they are deleted automatically.
Counted from upload. 0 keeps files until you delete them by hand.
Cloudflare R2 only — it forms part of the endpoint.
Leave blank to keep the key already saved.
Setting up upload sizes on your hosting
Out of the box most shared hosting allows uploads of only 2–64MB, which is
nowhere near enough for video. The limit is set by PHP on your own server, not by
this app — the current figure is shown above the file list on any client's
Client Area tab.
Where to change it
In cPanel: Software → MultiPHP INI Editor, choose your domain,
then use Basic mode (or Editor mode to paste values directly).
Outside cPanel, the same settings live in php.ini or a
.user.ini file in your web root.
The four settings that matter
Setting
What it controls
Suggested
upload_max_filesize
Largest single file
2048M
post_max_size
Largest whole request
2048M
max_execution_time
How long the script may run
600
max_input_time
How long PHP waits while receiving
600
Worth knowing
The lower of the first two wins. Setting
upload_max_filesize to 2048M while post_max_size stays
at 64M gives you a 64MB limit. Always raise both, and keep
post_max_size at least as large as
upload_max_filesize.
Leave memory_limit alone. It is often suggested
for uploads and it does not help — PHP writes an upload straight to a temporary
file on disk rather than holding it in memory.
The time limits matter as much as the size ones. A 1GB file
on a slow connection can take longer than max_input_time allows and
fail part-way even though its size was permitted. Raising the size limit does not
make an upload any faster.
Cloud storage does not lift this limit. Files still arrive
through this server before being passed on to S3, R2, Backblaze, Wasabi or Spaces,
so PHP's limits apply either way. Cloud storage solves disk space and bandwidth —
not the upload ceiling.
Your host may cap it. Many shared plans
enforce a maximum you cannot exceed. If the values do not stick after saving, that
is the host's ceiling — ask support whether it can be raised on your plan.
A proxy in front can have its own limit. Cloudflare's free
plan refuses request bodies over 100MB regardless of your PHP settings. If uploads
fail at a suspiciously round number, check there before changing anything else.
Mind your disk quota. Deliverables count against your hosting
allowance. The retention period above is what keeps that under control — files are
deleted automatically once it passes.
If a file is simply too big
Upload it to media/client-files/ by FTP and ask for it to be
registered against the client, or send that one file by WeTransfer and keep the
Client Area for everything else. Very large masters are usually better delivered
once by another route than fought through a web form.
Two-Factor Authentication
Asks for a six-digit code from Google Authenticator after your password. Set this up once, on the phone you'll keep.
Currently off. Anyone with the password can get in.
In Google Authenticator choose Add a code → Enter a setup key,
then type the key below. Leave the type as Time based.
Save these recovery codes somewhere safe now — they are shown once and never again.
Each one gets you in exactly once if you lose your phone.
Currently on.
Export Your Data
Downloads everything in your database as a single .sql file —
clients, jobs, projects, timeslips, invoices, budgets and portfolio records.
It is your data and you can take it out at any time.
This is an export, not a full backup.
Your uploaded files — invoices, client files, portfolio video, your logo —
live in the media/ folder and are not included.
For those, and for a copy stored safely off this server, use your host's
backup tool (in cPanel: Backup or JetBackup).
A backup kept on the same hosting is lost along with the hosting.
Worth doing before you apply an update, and worth keeping a copy somewhere
else — a monthly one in your own cloud storage beats a daily one that never
leaves the server.
The file contains your clients' contact details and your password hash.
Store it somewhere private.
Job Site Credentials
API credentials for the job search integrations used by Job Match, Job Search and Job Alerts. Leave a field blank to fall back to the value in api/config.php.
Accounting Integrations
Connect an accounting provider — FreeAgent, Xero or QuickBooks — so invoices created in Projects are real records there too.