Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
297 commits
Select commit Hold shift + click to select a range
3f44192
Fix incompatible method signatures that cause fatal errors
nkissebe Feb 24, 2026
f9e6801
Fix function-not-found errors
nkissebe Feb 24, 2026
153ada1
Fix duplicate array keys
nkissebe Feb 24, 2026
25aef03
Fix method name mismatches
nkissebe Feb 24, 2026
a1c73ed
Wiki: Rewrite Sanitizer as a self-contained class, drop utfnormalutil…
nkissebe Feb 18, 2026
78b1893
Migrations: Add legend to home page search form for accessibility
nkissebe Feb 22, 2026
f85d3fb
Libraries: Fix copy-paste bug in EnableTemplate migration macro
nkissebe Feb 25, 2026
3226f2d
Plugins: Rewrite variable-variables in blackwhite()
nkissebe Feb 24, 2026
812b99d
Libraries: Add getLanguages() method to Translator class
nkissebe Feb 26, 2026
eae383b
Wiki: Replace extract() with direct array access
nkissebe Feb 24, 2026
45615fb
Fix undefined constant references
nkissebe Feb 24, 2026
dc33c89
Modules: Fix search module legend fallback
nkissebe Feb 24, 2026
69e7b10
AssetAware: Guard $_option with property_exists check
nkissebe Feb 24, 2026
5f2d6fc
Jobs: Remove invalid constructor argument
nkissebe Feb 24, 2026
372b9f7
Fix undefined variables across components, modules and plugins
nkissebe Feb 24, 2026
05220f6
Fix class resolution: casing, qualification, missing classes, caught …
nkissebe Feb 25, 2026
2bafe65
Fix undefined static method bugs
nkissebe Feb 24, 2026
8999b18
Fix miscellaneous one-off errors
nkissebe Feb 24, 2026
1540951
Remove empty and unreferenced class files
nkissebe Feb 24, 2026
845615f
Config: Replace bare Repository instantiation with App config
nkissebe Feb 23, 2026
518f73c
Config: Simplify Repository API and add bare-key set() support
nkissebe Feb 24, 2026
5ca89cd
Newsletter: Remove the orphaned jobs plugin
nkissebe Feb 25, 2026
adbe9ad
Tests: Repair the test support files
nkissebe Feb 25, 2026
6988b83
Declare properties that were being created dynamically
nkissebe Feb 25, 2026
30f38f2
Plugins, Modules: Decouple from Obj
nkissebe Feb 25, 2026
e4187c6
Components: Fix Document facade method name casing to match definitions
nkissebe Feb 26, 2026
21da50e
API: Accept v1r0 versioned controller names
nkissebe Feb 24, 2026
251a103
API: Rename versioned controller classes from v1_0 to v1r0 format
nkissebe Feb 24, 2026
f5e507d
Components: Move view templates into tmpl/ subdirectories
nkissebe Feb 25, 2026
611a0c6
Bootstrap: Remove app.php from Composer autoload.files
nkissebe Feb 25, 2026
95ac2fd
Language: Restructure packs and add template overrides
nkissebe Feb 23, 2026
304a8dd
Fix docblock return types, missing returns, and void-return delegation
nkissebe Feb 25, 2026
e9da08a
Facades: Add @method annotations
nkissebe Feb 25, 2026
abab1cf
Fix a facade alias call, an undefined path variable and mod_mytools' …
nkissebe Feb 25, 2026
70ced54
Fix template errors found while reviewing the facade imports
nkissebe Feb 26, 2026
951d20c
Facades: Import facades explicitly
nkissebe Feb 26, 2026
5e3b43a
Modules: Let the Loader run class-based modules
nkissebe Feb 25, 2026
723016c
Modules: Convert to class-based loading following plugin pattern
nkissebe Feb 25, 2026
b7ba129
Html: make the admin forms and the menu items list work again
nkissebe Feb 25, 2026
df1dd5b
Cache: make the cache manager work again
nkissebe Feb 25, 2026
004aec8
Templates: keep the default template in app config, and let the loade…
nkissebe Feb 25, 2026
1f8d3e1
Wiki: use Composer's cebe/markdown, keep scope="col" through a subclass
nkissebe Feb 25, 2026
555f072
Tests: Add a Plugins suite
nkissebe Feb 25, 2026
6f3dd53
Projects: Make the filesystem API's multi-file download and metadata …
nkissebe Feb 25, 2026
47559aa
Fix PHPStan findings
nkissebe Feb 26, 2026
7802b2f
Database: Strip quote characters from identifiers before quoting
nkissebe Feb 26, 2026
c3e2d48
Config: Serialise nested config arrays with var_export
nkissebe Feb 26, 2026
9446c8f
Fix class names and namespaces that did not match their files
nkissebe Feb 26, 2026
33b3f21
Cart: Remove the unreachable do controller
nkissebe Feb 26, 2026
0f004ff
Carry forward the 2.4-main fixes the rebase could not place
nkissebe Sep 10, 2026
8b6cc88
Templates: Fall back to the configured template when no style is the …
nkissebe Sep 10, 2026
261ffb7
Installer: Read the database configuration the install just wrote
nkissebe Sep 10, 2026
6fe7743
Installer: Install from an answer file
nkissebe Sep 10, 2026
7f76194
Migrations: Find the tree when the core is shared
nkissebe Sep 10, 2026
d102a8c
Database: Let a freed statement be prepared again
nkissebe Sep 10, 2026
2d286d9
Database: Accept a column's modifiers where a helper takes a flag
nkissebe Sep 10, 2026
ebb4335
Tools: Script a demo hub
nkissebe Sep 10, 2026
aa27902
Database: Add the schema and query methods migrations call
nkissebe Sep 10, 2026
de22275
Database: Build the inserts and updates migrations write
nkissebe Sep 10, 2026
30fda6a
Database: Render an expression where a default value is expected
nkissebe Sep 10, 2026
45ee069
Database: Carry on when a statement commits the transaction itself
nkissebe Sep 10, 2026
110b381
Cache: Create the cache directory along with the client's
nkissebe Sep 10, 2026
b7bbbc8
Installer: Fill in what a migrated users table asks for
nkissebe Sep 10, 2026
2653424
Migrations: Fix the ones a fresh install stops on
nkissebe Sep 10, 2026
6a3ef20
Fix exceptions built with an error level as the previous throwable
nkissebe Sep 10, 2026
ddacea1
Users: Write the password salt in the shape the hub reads back
nkissebe Sep 10, 2026
efa4ee6
Installer: Name the sets of starting content
nkissebe Sep 10, 2026
6d8b8dc
Starter data: Stop offering a store the hub does not have
nkissebe Sep 10, 2026
41c4699
Lucent: Make the stylesheet buildable from its own source
nkissebe Sep 10, 2026
f085d4b
Lucent: Wear the hub's name, and carry the footer it declares
nkissebe Sep 10, 2026
b4885e3
Lucent: Give the template a palette
nkissebe Sep 10, 2026
ef6afc2
Lucent: Put the rest of the page positions in the page
nkissebe Sep 10, 2026
65c1b55
Sampledata: Build a hub's content from a pack of steps
nkissebe Sep 10, 2026
270055a
Lucent: Give the front page a hero
nkissebe Sep 10, 2026
e930dec
Lucent: Give the hero an eyebrow, actions and room for a picture
nkissebe Sep 10, 2026
feccc85
Lucent: Build with the compiler this repository ships
nkissebe Sep 10, 2026
e05e8d7
Tools: Build every template's stylesheet
nkissebe Sep 10, 2026
3619580
Lucent: Let a hub build its front page out of module positions
nkissebe Sep 11, 2026
06f859a
Migrations: Let a hub install with nothing in it
nkissebe Sep 11, 2026
83c9065
Installer: Give migrations the database the install just configured
nkissebe Sep 11, 2026
c389155
Content: Do not insist on featured categories nobody chose
nkissebe Sep 11, 2026
d26293b
Tools: Check that a hub still installs from nothing
nkissebe Sep 11, 2026
4eacd0f
Events: load a listener group once, and let lookups see past the wrap…
nkissebe Sep 11, 2026
620e6a4
Resources: make the detail page, the share links and abstracts work a…
nkissebe Sep 11, 2026
f16ee7b
Blog: keep the year four digits, and check that content reaches a page
nkissebe Sep 11, 2026
1126e46
Blog: say "1 comment"
nkissebe Sep 11, 2026
bd33bb8
Check the knowledge base too
nkissebe Sep 11, 2026
8b8c697
Forum: order a category's threads instead of erroring on them
nkissebe Sep 11, 2026
ca3ae46
Check the calendar too
nkissebe Sep 11, 2026
c5b251e
Support: show the ticket list, and install an administrator who can u…
nkissebe Sep 11, 2026
0b16fb8
Fix four places that read a variable a branch above may never have set
nkissebe Sep 11, 2026
b6eae91
Check the collections too
nkissebe Sep 11, 2026
be36b0d
Courses: restore two short-circuits, and stop emitting invalid CSS
nkissebe Sep 11, 2026
f4ccbe6
Check the citations too
nkissebe Sep 11, 2026
6577701
Projects: let a public project look public, and be reachable at all
nkissebe Sep 11, 2026
0192e21
Check the wish list too
nkissebe Sep 11, 2026
6ff0733
Check that running a sample data pack again changes nothing
nkissebe Sep 11, 2026
ddc0dc1
Publications: make a publication page render, and its identifiers wel…
nkissebe Sep 11, 2026
b0973ad
Starter data: stop advertising a Store the data set has switched off
nkissebe Sep 11, 2026
42b4264
Make the rest of the hub reachable, and the parts of it that were not…
nkissebe Sep 11, 2026
3c3c71f
Check the newsletter too
nkissebe Sep 11, 2026
0019ace
Newsletter: send issues out under the hub's name, not the template's
nkissebe Sep 11, 2026
47b03ab
Carry two shipped-default fixes to the hubs that already have the old…
nkissebe Sep 11, 2026
8496d95
Storefront: stop advertising a Store that isn't there, on hubs that h…
nkissebe Sep 11, 2026
95c6ffc
Check that the members and groups have their pictures
nkissebe Sep 11, 2026
59222e2
Wiki: stop showing every reply twice
nkissebe Sep 11, 2026
5f46ce3
Check the wiki has a history, and count its comments when re-running
nkissebe Sep 11, 2026
8a855e1
Wiki: name the people either side of a diff
nkissebe Sep 11, 2026
18e7f1e
Check that a diff names who made each revision
nkissebe Sep 11, 2026
d800117
Lucent: lay out the aside the older views emit
nkissebe Sep 11, 2026
eae9a70
Groups: a group with a page of its own no longer 404s on its overview
nkissebe Sep 11, 2026
3529954
Groups: put a group's own pages in its menu
nkissebe Sep 11, 2026
1372f9f
Groups: stop listing deleted events on a group's calendar
nkissebe Sep 11, 2026
2d49fff
Check that there is something behind the group tabs
nkissebe Sep 11, 2026
6210fa5
Check that a download actually downloads
nkissebe Sep 11, 2026
4d66b94
Check that a course offering can be opened
nkissebe Sep 11, 2026
30dabf8
Check the reposts and the registration form, and count the course tables
nkissebe Sep 11, 2026
fe677da
Publications: keep the server's own paths out of a downloaded bundle
nkissebe Sep 11, 2026
73f83ab
Check that a publication bundle has something in it
nkissebe Sep 11, 2026
fd803a6
Projects: make the file store usable again without git
nkissebe Sep 11, 2026
e17472d
Check the part of a hub a visitor cannot see
nkissebe Sep 11, 2026
23bb9b4
Tools: find the content a narrow screen hides
nkissebe Sep 11, 2026
f5c8336
Lucent: let a wide table scroll rather than be cut off
nkissebe Sep 11, 2026
bae1678
Jobs: stop the header options being wider than a phone
nkissebe Sep 11, 2026
efc0627
A template of its own for the Mesozoic hub
nkissebe Sep 11, 2026
f8a2e8a
Mesozoic: a palette taken from rock
nkissebe Sep 11, 2026
b93323f
Mesozoic: a serif for the headings, a native sans for the text
nkissebe Sep 11, 2026
10e8181
Mesozoic: a band of animals along the top of the footer
nkissebe Sep 11, 2026
adf1291
Mesozoic: plants along the head of the page as well as the foot
nkissebe Sep 11, 2026
5722dc5
Templates: answer to the core's own name for hidden text, and measure…
nkissebe Sep 11, 2026
6063703
Mesozoic: a title band, and colours that meet 1.4.3 where the templat…
nkissebe Sep 11, 2026
1767b0d
Mesozoic: bring every page up to 4.5:1, without touching a component
nkissebe Sep 11, 2026
ac99531
Don't let a template sweep overwrite kimera and kameleon
nkissebe Sep 11, 2026
0c1cd51
Templates: saving the default style stopped being the default
nkissebe Sep 11, 2026
7e0c225
Lucent and mesozoic: the two settings a hub actually chooses
nkissebe Sep 11, 2026
40cd134
Make the tip pass phpcs again
nkissebe Sep 11, 2026
465ac84
Mesozoic: the page title as a card again, and why it works this time
nkissebe Sep 11, 2026
0af2ba0
Mesozoic: take the grey slab off a landing page rather than repaint it
nkissebe Sep 11, 2026
afcd269
Mesozoic: three bands now, and a way to know what text can be read ov…
nkissebe Sep 12, 2026
b3a1921
Mesozoic: a band across the title card, and a footer that starts sooner
nkissebe Sep 12, 2026
3516040
Sample data: let a pack write the hub's furniture, not just its content
nkissebe Sep 12, 2026
8f54066
Mesozoic: no grey left on the page, and surfaces that are not flat
nkissebe Sep 12, 2026
c0e60f8
Mesozoic: a torn edge, a world, and a way to find the grey
nkissebe Sep 12, 2026
32ee47c
Mesozoic: the real Late Cretaceous, on the projection it is published on
nkissebe Sep 12, 2026
176f63f
Mesozoic: coastlines rather than blobs, moved the way a plate moves
nkissebe Sep 12, 2026
7251cf8
Resources: a capital D, and retire Tools (Windows)
nkissebe Sep 12, 2026
52469f2
Resources: remove the Windows tools plugin
nkissebe Sep 12, 2026
6a1013b
Resources: the tag browser lost its styling when its links became spans
nkissebe Sep 12, 2026
0af8a29
Resources: give the tag browser its keyboard back
nkissebe Sep 12, 2026
c6f0c11
Lucent: the four places its own colours fall under 1.4.3
nkissebe Sep 12, 2026
5cb7485
A screenshot runner, a catalogue, and a way to review what it takes
nkissebe Sep 12, 2026
25d6b4c
Mesozoic: what the first review run found, and notices that read as n…
nkissebe Sep 12, 2026
93e8053
Screenshots: bound the wait for webfonts, and keep the manifest
nkissebe Sep 12, 2026
8faada7
Overlap detection that measures what a reader sees, and the two it th…
nkissebe Sep 12, 2026
3665a73
Mesozoic: the last of the grey, down to the admin template and one image
nkissebe Sep 12, 2026
379fac4
Three things a picture showed, and one it did not
nkissebe Sep 12, 2026
23ad472
Screenshots: a catalogue for each hub, and one for the welcome hub
nkissebe Sep 12, 2026
e686d26
Mesozoic: notice colours that hold up on their own grounds
nkissebe Sep 12, 2026
9619236
Meridian: the template a hub wears before it has a subject
nkissebe Sep 12, 2026
09397c6
A new hub's footer should not be dated 2019
nkissebe Sep 12, 2026
a207919
Search: a term that matched a wiki or forum page took the page down
nkissebe Sep 12, 2026
b6e0303
Meridian: the last of the greys, and a review that knows whose page i…
nkissebe Sep 12, 2026
bfb9ceb
Both templates: the search page, now that there is one to look at
nkissebe Sep 12, 2026
eeaff29
Judge a template where there is something to judge it on
nkissebe Sep 12, 2026
01879c5
Lucent: forty-four pieces of text under 4.5:1, now none
nkissebe Sep 12, 2026
8f307cf
Views: a heading is a promise that something follows it
nkissebe Sep 12, 2026
2b008e2
Views: a page with nothing on it should say so
nkissebe Sep 12, 2026
dd13f05
Lucent: one stray warm grey, and a review that knows which greys are …
nkissebe Sep 12, 2026
676558c
A hub with nothing in it should still have a way in
nkissebe Sep 12, 2026
6c273e1
The registration form was unusable on a phone
nkissebe Sep 12, 2026
9df2adb
Search results that took the page sideways, and a tool that cried wol…
nkissebe Sep 12, 2026
2faf893
Text over a picture is now judged rather than declined
nkissebe Sep 12, 2026
dfdfd12
Say what the tools do now
nkissebe Sep 12, 2026
97a6f33
A new hub's front page was the only one told to print its menu item's…
nkissebe Sep 12, 2026
636866f
The front page a hub has not chosen, and the one it draws itself
nkissebe Sep 13, 2026
c4c74b2
A page shell nobody wrote rendered nothing and called it success
nkissebe Sep 13, 2026
9aedabd
Asking for a mobile template no hub has cost you the whole site
nkissebe Sep 13, 2026
6a70188
Ask about the mobile template only when one has been asked for
nkissebe Sep 13, 2026
c0eaefc
A template can draw its own front page
nkissebe Sep 13, 2026
9319be8
Ask the document for a template's asset rather than spelling it out
nkissebe Sep 13, 2026
51112db
A template can be a child of another and ship only what it changes
nkissebe Sep 13, 2026
cc2f603
Document the front page, template inheritance and the asset helper
nkissebe Sep 13, 2026
a3602f4
Error pages are drawn by a different document, and asset() was not on it
nkissebe Sep 13, 2026
c607494
The one link on the last-resort error page was a 404
nkissebe Sep 13, 2026
fb42c13
Asking any page for the super group layout printed a PHP error
nkissebe Sep 13, 2026
02793ea
Take child templates back out
nkissebe Sep 13, 2026
f36fe3b
The sample data pack machinery is not the CMS's business
nkissebe Sep 13, 2026
293d25a
Stop the frieze generator naming one developer's home directory
nkissebe Sep 13, 2026
7fcc8d8
Let any menu item keep out of the menu, not only the ones with no com…
nkissebe Sep 14, 2026
f553f97
Hiding a menu item should hide what is under it
nkissebe Sep 14, 2026
8b4a19f
The legal pages were printing the hub's URL where its name belongs
nkissebe Sep 14, 2026
f26e940
Bring the starter data's legal pages up to date
nkissebe Sep 14, 2026
e202241
Finish the legal pages rather than leaving blanks nobody fills in
nkissebe Sep 14, 2026
f2cacb2
Finish the pages that told a visitor the site was not set up yet
nkissebe Sep 14, 2026
ddcaf50
Stop the shipped pages naming the hub they are on
nkissebe Sep 14, 2026
510d07b
Give meridian a front page, out of what the welcome template had
nkissebe Sep 14, 2026
c1c289d
Make the front page's parallax large enough to notice
nkissebe Sep 14, 2026
a0604bc
Show the hero's pictures on a screen that is merely wide, not huge
nkissebe Sep 14, 2026
a2946ef
Ask about reduced motion every frame, not once at startup
nkissebe Sep 14, 2026
af64080
Let the laptops answer to the pointer instead of to the scroll
nkissebe Sep 14, 2026
0fb5842
Retire the welcome template
nkissebe Sep 14, 2026
4e0777e
Let a hub put its wordmark in the masthead
nkissebe Sep 14, 2026
b5ed507
Check what a hub holds the moment it is installed
nkissebe Sep 14, 2026
8dd7daf
The hero's second button pointed at a page an empty hub does not have
nkissebe Sep 14, 2026
c610614
Stop the front page promising tools a hub cannot run
nkissebe Sep 14, 2026
34f5ea4
Keep the hero's words off the picture beside them
nkissebe Sep 14, 2026
6862cd9
Write down what is wrong with the menu routing, before it is forgotten
nkissebe Sep 14, 2026
1a2a900
Say how the generated menu is protected, and correct the count
nkissebe Sep 15, 2026
6ca50b7
Give a menu a type rather than leaving its purpose to be inferred
nkissebe Sep 15, 2026
93b9771
Say where the generated menus appear in the admin, and what not to of…
nkissebe Sep 15, 2026
900bf44
Let the login URLs be the routes the components already answer to
nkissebe Sep 15, 2026
c14ef1b
Let a menu say what it is for, and stop one being displayed by accident
nkissebe Sep 15, 2026
32b2fd7
Generate a component's address where its admin entry is already gener…
nkissebe Sep 15, 2026
df538cb
Say what each menu is on the screen where somebody would look
nkissebe Sep 15, 2026
8ccc8fa
Keep pages out of the generated menu, and let a route follow its comp…
nkissebe Sep 15, 2026
c9f31e0
Protect what the installer generates, and let a menu be created as ro…
nkissebe Sep 15, 2026
677e678
Record what of the menu routing plan is built
nkissebe Sep 15, 2026
70528e7
One place that makes a component route, and a lazy one for development
nkissebe Sep 15, 2026
8fdd679
Record C as built
nkissebe Sep 15, 2026
344e7ec
Let a menu item say what address it answers at
nkissebe Sep 15, 2026
ac43aa2
Record A as built, and the alias-collapse decision it leaves open
nkissebe Sep 15, 2026
67e2346
Record which address wins between a menu item and a component route
nkissebe Sep 15, 2026
7391c9b
Decide which menu item owns an address, in both directions
nkissebe Sep 15, 2026
39c60ef
Give a non-sef url the page identity its sef twin already had
nkissebe Sep 15, 2026
d237226
One list of what is not a page, and make lazy routing obey it
nkissebe Sep 15, 2026
4732d69
Stop the sample data throwing away the menu's unique key
nkissebe Sep 15, 2026
43434e1
Give an address to every component with site code, not the interestin…
nkissebe Sep 15, 2026
40dac3d
Tie a menu item to whether its component is switched on
nkissebe Sep 15, 2026
59c579a
AddComponentEntry follows: the entry no longer copies enabled
nkissebe Sep 15, 2026
c0764c7
Record part two in the plan: precedence, and tying items to extensions
nkissebe Sep 15, 2026
5d3996c
Stop /redirect answering 500 to its own name
nkissebe Sep 15, 2026
6e2cb83
Load jQuery on the admin control panel
nkissebe Sep 15, 2026
267e269
Make batch processing work in the menu manager
nkissebe Sep 15, 2026
88b75c8
A row at an address is not the same as an address that answers
nkissebe Sep 15, 2026
31a3083
Let a section keep its prefix as you move around inside it
nkissebe Sep 15, 2026
d3b1c97
Correct the alias section: nest them, do not flatten them
nkissebe Sep 15, 2026
60f9339
Record that one component can now have several addresses
nkissebe Sep 15, 2026
71f65c9
The open list was four-fifths stale
nkissebe Sep 15, 2026
8359617
Three multi-line foreach headers, hoisted for the style checker
nkissebe Sep 15, 2026
2b51b66
Fix what the final review found
nkissebe Sep 15, 2026
d4a5c0f
Fix what a review of the whole branch found in the February platform …
nkissebe Sep 16, 2026
54b9e6c
Fix what a full review of the September component and migration work …
nkissebe Sep 16, 2026
3103030
Fix what a full review of the February cleanup work found
nkissebe Sep 16, 2026
09eebf2
Fix what a full review of the September template and front-page work …
nkissebe Sep 16, 2026
d26ba33
Flavors are default and full, and a flavor is the tools switch
nkissebe Sep 16, 2026
0c3e3f5
Flavors are data: JSON files of levers, cascading, from wherever you …
nkissebe Sep 16, 2026
270a798
Flavors read YAML as well as JSON, and can publish or hide menu items
nkissebe Sep 16, 2026
ce355aa
Flavors can publish or hide module instances; the cascade keeps integ…
nkissebe Sep 16, 2026
35f5cdf
A fresh install died in the middle: AddComponentEntry called a method…
nkissebe Sep 17, 2026
c2ba522
An install told which template to use now comes up wearing it
nkissebe Sep 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
379 changes: 379 additions & 0 deletions INSTALL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,379 @@
# HUBzero CMS Installation Guide

This guide walks you through installing HUBzero CMS from a fresh git clone.

## Table of Contents

1. [Prerequisites](#prerequisites)
2. [Quick Start](#quick-start)
3. [Installation Steps](#installation-steps)
4. [Troubleshooting](#troubleshooting)

## Prerequisites

Before installing HUBzero, ensure your system meets the following requirements.

### PHP 8.2 or Higher

HUBzero requires PHP 8.2.0 or later.

**Check your version:**
```bash
php -v
```

**Installation:**

- **Ubuntu/Debian:**
```bash
sudo apt update
sudo apt install php8.2 php8.2-cli
```

- **RHEL/CentOS/Rocky Linux:**
```bash
sudo dnf install php82 php82-cli
```

- **macOS (Homebrew):**
```bash
brew install php@8.2
```

### Required PHP Extensions

The following PHP extensions must be installed and enabled:

| Extension | Purpose | Installation |
|-----------|---------|--------------|
| `pdo` | Database abstraction layer | Usually included with PHP |
| `pdo_mysql` | MySQL database driver | `apt install php8.2-mysql` |
| `json` | JSON data handling | Usually included with PHP |
| `mbstring` | Multibyte string support | `apt install php8.2-mbstring` |
| `openssl` | Encryption and SSL support | Usually included with PHP |
| `curl` | HTTP client for external APIs | `apt install php8.2-curl` |
| `gd` | Image processing and manipulation | `apt install php8.2-gd` |
| `fileinfo` | MIME type detection | `apt install php8.2-fileinfo` |
| `zip` | Archive handling | `apt install php8.2-zip` |

**Check installed extensions:**
```bash
php -m | grep -E "pdo|json|mbstring|openssl|curl|gd|fileinfo|zip"
```

**Install all required extensions (Ubuntu/Debian):**
```bash
sudo apt install php8.2-mysql php8.2-mbstring php8.2-curl php8.2-gd php8.2-zip
```

**Install all required extensions (RHEL/CentOS/Rocky Linux):**
```bash
sudo dnf install php82-mysqlnd php82-mbstring php82-curl php82-gd php82-zip
```

### Unzip Command

The `unzip` command is required by Composer to extract packages.

**Check if installed:**
```bash
which unzip
```

**Installation:**

- **Ubuntu/Debian:**
```bash
sudo apt install unzip
```

- **RHEL/CentOS/Rocky Linux:**
```bash
sudo dnf install unzip
```

- **macOS:**
```bash
brew install unzip
```

### MySQL Database

HUBzero requires a MySQL 5.7+ or MariaDB 10.3+ database server.

**Installation:**

- **Ubuntu/Debian:**
```bash
sudo apt install mysql-server
sudo mysql_secure_installation
```

- **RHEL/CentOS/Rocky Linux:**
```bash
sudo dnf install mysql-server
sudo systemctl start mysqld
sudo mysql_secure_installation
```

**Create a database and user:**
```sql
CREATE DATABASE hubzero CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'hubzero'@'localhost' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON hubzero.* TO 'hubzero'@'localhost';
FLUSH PRIVILEGES;
```

### Web Server

HUBzero supports Apache or Nginx.

**Apache (recommended):**
```bash
# Ubuntu/Debian
sudo apt install apache2 libapache2-mod-php8.2
sudo a2enmod rewrite
sudo systemctl restart apache2

# RHEL/CentOS/Rocky Linux
sudo dnf install httpd php82-fpm
sudo systemctl enable httpd php82-fpm
sudo systemctl start httpd php82-fpm
```

**Nginx:**
```bash
# Ubuntu/Debian
sudo apt install nginx php8.2-fpm
sudo systemctl restart nginx php8.2-fpm
```

### Directory Permissions

The web server user must have write access to the installation directory.

**Check the web server user:**
```bash
# Apache on Ubuntu/Debian
ps aux | grep apache # Usually www-data

# Apache on RHEL/CentOS
ps aux | grep httpd # Usually apache

# Nginx
ps aux | grep nginx # Usually www-data or nginx
```

**Set permissions:**
```bash
# Replace www-data with your web server user
sudo chown -R www-data:www-data /path/to/hubzero-cms
sudo chmod -R 775 /path/to/hubzero-cms
```

## Quick Start

For those familiar with HUBzero, here's the quick installation:

```bash
# Clone the repository
git clone https://github.com/hubzero/hubzero-cms.git
cd hubzero-cms

# Run the installer
php core/bin/muse install
```

The installer will guide you through the remaining steps.

## Installation Steps

### Step 1: Clone the Repository

```bash
git clone https://github.com/hubzero/hubzero-cms.git
cd hubzero-cms
```

### Step 2: Run Pre-flight Checks

Before installing, verify your system meets all requirements:

```bash
php core/bin/muse install check
```

This will check:
- PHP version
- Required PHP extensions
- System commands (unzip)
- Directory permissions
- Composer dependencies

Fix any issues reported before proceeding.

### Step 3: Install Composer Dependencies

If you want to install dependencies separately:

```bash
php core/bin/muse install vendor
```

This is optional - the full installer will do this automatically if needed.

### Step 4: Run the Full Installation

```bash
php core/bin/muse install
```

The installer will:

1. **Pre-flight Checks** - Verify all requirements are met
2. **Create App Directory** - Set up the `/app` directory structure with proper permissions
3. **Database Setup** - Prompt for database credentials and test the connection
4. **Load Schema** - Create the database tables
5. **Load Base Data** - Insert required system data
6. **Load Sample Data** (optional) - Add example content
7. **Generate Configuration** - Create configuration files in `/app/config`
8. **Create Admin User** - Set up the initial administrator account
9. **Run Migrations** (optional) - Apply any pending database migrations
10. **Final Verification** - Confirm the installation is complete

### Step 5: Configure Your Web Server

**Apache Virtual Host Example:**

```apache
<VirtualHost *:80>
ServerName your-hub.example.com
DocumentRoot /path/to/hubzero-cms

<Directory /path/to/hubzero-cms>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/hubzero-error.log
CustomLog ${APACHE_LOG_DIR}/hubzero-access.log combined
</VirtualHost>
```

**Nginx Configuration Example:**

```nginx
server {
listen 80;
server_name your-hub.example.com;
root /path/to/hubzero-cms;
index index.php;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ /\. {
deny all;
}
}
```

### Step 6: Access Your Hub

Open your browser and navigate to your hub's URL. Log in with the admin credentials you created during installation.

## Installation Commands Reference

| Command | Description |
|---------|-------------|
| `muse install` | Run the full installation process |
| `muse install check` | Run pre-flight checks only |
| `muse install vendor` | Install Composer dependencies only |
| `muse install appdir` | Create the app directory structure only |
| `muse install --force` | Force reinstallation (overwrites existing) |

## Troubleshooting

### Pre-flight Check Failures

**PHP version too low:**
```
[FAIL] PHP 7.4.33 (requires 8.2.0+)
```
Upgrade PHP to version 8.2 or higher.

**Missing PHP extension:**
```
[FAIL] pdo_mysql extension - MySQL database driver
```
Install the missing extension and restart your web server.

**Unzip not found:**
```
[FAIL] unzip command not found
```
Install the unzip package for your operating system.

**Directory not writable:**
```
[FAIL] /path/to/hubzero-cms is not writable
```
Adjust permissions so the web server user can write to the directory.

**Already installed:**
```
[FAIL] HUBzero appears to already be installed
```
Use `--force` flag to reinstall, or manually remove `/app/config/database.php`.

### Database Connection Issues

If you cannot connect to the database:

1. Verify MySQL/MariaDB is running:
```bash
sudo systemctl status mysql
```

2. Test the connection manually:
```bash
mysql -u hubzero -p -h localhost hubzero
```

3. Check that the user has proper privileges:
```sql
SHOW GRANTS FOR 'hubzero'@'localhost';
```

### Permission Issues

If you encounter permission errors during installation:

```bash
# Reset ownership
sudo chown -R www-data:www-data /path/to/hubzero-cms

# Set directory permissions
sudo find /path/to/hubzero-cms -type d -exec chmod 775 {} \;

# Set file permissions
sudo find /path/to/hubzero-cms -type f -exec chmod 664 {} \;

# Secure config directory
sudo chmod 770 /path/to/hubzero-cms/app/config
```

### Getting Help

- Check the logs in `/app/logs/`
- Run `muse install check` to diagnose issues
- Visit [HUBzero Documentation](https://help.hubzero.org/)
- Report issues at [GitHub Issues](https://github.com/hubzero/hubzero-cms/issues)
Loading