User guide and support
A walk through the system as it actually looks, from installing it to booking a lab test. Screenshots throughout, and a public issue tracker when something is wrong.
Getting it running
You have two ways in. If you only want a look, use Docker and you will not have to install PHP on your machine. If you are putting it on a server, install it properly.
The quick look
Clone the repository, bring the containers up, create the tables, and open your browser. Three commands.
git clone https://github.com/ictinnovations/ICTHospital.git cd ICTHospital docker compose up -d docker compose exec app php artisan migrate --seed
That gives you an administrator account, an empty hospital record, the permission catalogue with everything granted to Admin, and no invented patients. Sign in and change the password before you do anything else.
On a server
You need PHP 8.2 or newer, MySQL or MariaDB, and Composer. Install the dependencies, copy the environment file, generate the application key and the API keys, then point it at your database and migrate.
composer install cp .env.example .env php artisan key:generate php artisan passport:keys php artisan migrate --seed
If you are moving from an older version, run the schema check first. It reports what it would change and touches nothing until you tell it to.
php artisan hospital:modernise-schema php artisan hospital:modernise-schema --apply
The full installation notes, the licence and the release history live in the repository README.
A walk through the system
Six screens, in the order you would meet them on a normal day.
1The dashboard
What you land on after signing in. Counts across the top for doctors, patients, appointments, prescriptions, case histories, lab reports, documents and payment invoices, then income against expense by month and a share of the current month underneath. If a number here looks wrong, the module behind it is one click away.

The dashboard, with the module menu down the left.
2Set up your departments first
Departments come before doctors, because a doctor belongs to one. Give each a name and a description that means something to whoever is booking, since the description is what a receptionist reads when they are not sure where to send someone. Every list in the system exports to Excel, CSV, PDF or the printer from the same row of buttons.

Departments, with the export buttons that appear on every list in the system.
3Book a lab test and bill it in one form
Pick the collection centre, the patient and the referring doctor, record who took the sample and the specimen type, then add the tests. The totals column on the right adds up as you go, takes a discount, and accepts a deposit with the payment type against it. You are not raising an order in one screen and an invoice in another, which is where the two usually drift apart.

Lab test booking. The billing panel on the right is part of the same form.
4Track the report through to the invoice
Every booking appears in the lab patient list with its report number, the patient, a contact number and a status you can change inline as the sample moves. The invoice button on each row prints what the patient owes for that test without you leaving the list.

The lab patient list, with status changed in place and an invoice on every row.
5Run the pharmacy as its own business
The pharmacy has its own dashboard, because the money in it behaves differently from the rest of the hospital. Sales and expenses for the day, the medicine count, and a statistics panel that tells you the number of sales, the totals, and how many lines are out of stock. That last figure is the one to watch.

The pharmacy dashboard, reported separately from the hospital ledger.
6Keep a donor register
If you hold your own blood supply, the donor register is a short form: name, blood group, age, the date they last gave, and a contact number. The point is being able to find three matching donors quickly at two in the morning, so fill in the phone number even when the rest is thin.

Adding a donor to the blood bank register.
Turning on SMS and voice
Messaging is the one part that needs something outside the application. It runs on ICTCore, our open source communications framework, and until you point the system at an ICTCore server the reminder jobs will tell you politely that they have nothing to talk to.
Set the ICTCore address, user and password under Settings, choose whether appointment and payment reminders go out as SMS or as voice, and then let the two scheduled jobs run from cron:
php artisan hospital:appointment-reminder php artisan hospital:payment-reminder
The first texts everyone with an appointment tomorrow. The second texts everyone whose invoice is short of what they have paid. Both report why they did nothing rather than failing, so it is safe to put them on cron before the rest is configured.
If you are weighing up what else the same engine can do, from fax to interactive voice response, the ICTCore use cases are worth reading before you design your own integration. Video consultation targets LiveKit and is configured separately.
When something goes wrong
The install fails partway through migrating
Almost always the database user cannot create tables. Grant it CREATE, ALTER, INDEX and REFERENCES on its own schema and run the migration again. It is safe to rerun.
Pages load but nothing saves
Check that the storage and bootstrap cache directories are writable by the user your web server runs as. Laravel writes its compiled views there, and a read-only storage directory produces exactly this symptom.
The API returns a server error
Run the key generator. The API guard needs a keypair that is not in the repository, on purpose, because it is a secret.
php artisan passport:keys
A user can see something they should not
Permissions are granted per role, not per person. Open Permissions, tick the roles you want to edit, press Get List, and set them. There are ninety of them across Admin, Doctor, Nurse and Accountant, grouped by module, and every change is written as a complete set rather than a patch.
Something else
Check the application log first. It is more specific than the page you are looking at, and it is the first thing we will ask for.
tail -100 storage/logs/laravel.log
Where to get help
Issue tracker
Bugs and feature requests, in public. Give us the PHP version, the database version and the exact error and you will get a useful answer faster.
Source code
The whole application under the GPL-3.0. When the documentation and the software disagree, the source settles it.
Guide as a PDF
The older manual in one file, for printing or for handing to staff who will not be at a screen.
All screenshots
Every screen, not just the six above, so you can judge the software before installing anything.
Support ticket
Deployment, customisation, migrating data out of an existing system, or anything you would rather not discuss in public.
Our other projects
The PBX, the fax server, the dialer and the communication framework underneath all of them.