Membora · Quickstart
Membora Quickstart, as shipped in the download
The QUICKSTART.txt in the download — the same steps your delivery email carries.
MEMBORA — QUICKSTART
===================
REQUIREMENTS
------------
- PHP 8.0+ with extensions: pdo, pdo_sqlite (or pdo_mysql)
- MySQL 5.7+ OR SQLite 3 (SQLite requires no extra setup)
- A web server (Apache with mod_rewrite, or Nginx with try_files)
SHARED HOSTING / CPANEL (RECOMMENDED FOR MOST BUYERS)
------------------------------------------------------
1. Upload the CONTENTS of the `app/` folder to your web root (e.g. public_html/)
or a subdirectory (e.g. public_html/membora/).
2. Make sure this directory is writable by PHP:
data/
Via cPanel File Manager: right-click -> Permissions -> set to 755 or 775.
3. Visit https://yourdomain.com/install/ in your browser.
4. Fill in the installer:
- Database: choose MySQL (fill in host/name/user/pass) or SQLite (no setup)
- Club or association name, currency and timezone
- Admin name, email + password
5. The installer writes config.php and redirects you to the login page.
6. Sign in. On the dashboard or Settings, click "Load demo data" to explore a
sample club -- including an AGM that was quorate and carried a motion, and a
committee meeting that was NOT, whose motion is still open. That second one is
deliberate: it is the state the product exists to make visible.
TYPICAL FIRST-RUN WORKFLOW
--------------------------
1. Settings -> confirm the club name, currency and timezone.
2. Rates -> create the subscription rates your constitution names
(e.g. "Full member", "Concession", "Life member",
"Honorary member"). Life and honorary never lapse.
3. Members -> add a member, or import a roster from CSV.
4. Member page -> put them on a rate; a subscription term starts and
(optionally) a charge is raised.
5. Meetings -> schedule a meeting and set its QUORUM. This is the number
everything else hangs off: a motion cannot be carried at a
meeting that did not reach it.
6. Roll call -> pick the meeting, type a name, mark present or apologies.
The quorum count moves as you go. Members in arrears are
still marked present -- attendance is a record of fact.
7. Motions -> record what was proposed, then who voted which way. A member
whose subscription has lapsed cannot have a vote recorded;
Membora says so, with the date it lapsed.
8. Payments -> record subscriptions paid; watch the Arrears list, because
everyone on it loses their vote at the next meeting.
VPS / SELF-HOSTED
-----------------
Apache example:
<VirtualHost *:80>
DocumentRoot /var/www/membora/app
<Directory /var/www/membora/app>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Run the web installer as above, or use the CLI seeder to load demo data:
php bin/demo.php # loads demo data (login: admin@membora.app / admin123)
DOCKER (QUICK TEST)
-------------------
docker run --rm -p 8080:8080 \
-v "$(pwd)/app:/var/www/html" \
-w /var/www/html \
php:8.3-cli \
php -S 0.0.0.0:8080 router.php
Then visit http://localhost:8080/install/
RUNNING THE TESTS
-----------------
docker run --rm -v "$(pwd)/app:/app" -w /app php:8.3-cli php tests/run.php
Expect: ALL 90 TESTS PASSED (0 failed)
POST-INSTALL SECURITY CHECKLIST
--------------------------------
[ ] config.php is protected (the .htaccess does this automatically)
[ ] data/ is not web-accessible (.htaccess blocks it automatically)
[ ] Use HTTPS in production
[ ] Keep PHP updated
[ ] Use a strong admin password
NOTES
-----
* Membora is the SECRETARY-side register, not a public club website.
* "Today", lapse dates and subscriptions-this-month are all computed in the
timezone you set in Settings.
* Money is stored as integer cents; enter subscriptions as plain decimals (35.00).
* Quorum 0 on a meeting means "none required", not "a requirement of zero".
Capacity 0 likewise means no limit, which is what most club meetings are.
* The demo's "Reset all data" removes members, subscriptions, payments, meetings,
motions and votes, but keeps your login and settings.
← Back to Membora · Manual · API · Test run