Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
af76d10
Refactor components
neonspectra Jan 14, 2026
79155b4
fix vue scoping issues causing ui to break
neonspectra Jan 14, 2026
d1876ce
update tests
neonspectra Jan 14, 2026
68be91d
nightly build and final touches
neonspectra Jan 14, 2026
8fa3371
manual release and versioning display cleanup
neonspectra Jan 14, 2026
4d143d3
update readme
neonspectra Jan 14, 2026
0991ded
typo
neonspectra Jan 14, 2026
55c29c8
formatting
neonspectra Jan 14, 2026
0e505b0
authors
neonspectra Jan 14, 2026
dc6eec6
fix tests and skip ci on markdown-only changes
neonspectra Jan 14, 2026
6f56d86
ci: run tests only on pull requests
neonspectra Jan 14, 2026
3537763
show commit label on a new line
neonspectra Jan 14, 2026
022bb66
Update epcc.php
neonspectra Jan 14, 2026
3ba5d4b
fix test
neonspectra Jan 14, 2026
4eb51b8
add commit hash to export save files
neonspectra Jan 14, 2026
27f9ef0
fix versioning display
neonspectra Jan 14, 2026
64d25c9
change webpage name
neonspectra Jan 14, 2026
8785ab0
Revise welcome text and tool description in Welcome.vue
neonspectra Jan 14, 2026
7a0cafb
Fix formatting of EU notice in Welcome.vue
neonspectra Jan 14, 2026
278a233
Revise About.vue content and licensing details
neonspectra Jan 14, 2026
f3f185c
Revise LICENSE.md with updated copyright and terms
neonspectra Jan 14, 2026
2014c61
Update LICENSE.md
neonspectra Jan 14, 2026
12b65aa
Update LICENSE.md
neonspectra Jan 14, 2026
fc2527c
Update license statement for EPCC
neonspectra Jan 14, 2026
08bc918
Update README.md
neonspectra Jan 14, 2026
a82c0f8
Update README.md
neonspectra Jan 14, 2026
adedbbe
Update README.md
neonspectra Jan 14, 2026
18bbb72
Update README.md
neonspectra Jan 14, 2026
43d6ae8
Fix link to database SQL dump in README
neonspectra Jan 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: CI

on:
pull_request:
paths-ignore:
- '**/*.md'

jobs:
tests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.4'
extensions: mbstring, sqlite3, pdo_sqlite, dom, curl, fileinfo
coverage: none

- name: Install Composer dependencies
run: composer install --no-interaction --no-progress --prefer-dist

- name: Prepare env file
run: |
if [ ! -f .env ]; then
cp testing.env .env
fi

- name: Run PHPUnit
run: php artisan test
49 changes: 49 additions & 0 deletions .github/workflows/nightly-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Nightly Image

on:
push:
branches:
- main
paths-ignore:
- '**/*.md'

permissions:
contents: read
packages: write

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set version metadata
id: version
run: |
echo "sha_short=$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT"
echo "release_date=$(date -u +%Y-%m-%d)" >> "$GITHUB_OUTPUT"

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push image
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: |
ghcr.io/neonspectra/epcc:nightly
ghcr.io/neonspectra/epcc:sha-${{ steps.version.outputs.sha_short }}
build-args: |
EPCC_DISPLAY_VERSION=${{ github.sha }}
EPCC_DISPLAY_VERSION_NAME=nightly
EPCC_DISPLAY_COMMIT=${{ github.sha }}
EPCC_DISPLAY_RELEASE_DATE=${{ steps.version.outputs.release_date }}
62 changes: 62 additions & 0 deletions .github/workflows/release-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Release Image

on:
workflow_dispatch:
inputs:
version_name:
description: "Release name (e.g., Gate Jump)"
required: true
type: string
version_number:
description: "Release number (e.g., 1.52)"
required: true
type: string

permissions:
contents: read
packages: write

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Normalize tags
id: tags
run: |
VERSION_NUMBER="${{ inputs.version_number }}"
VERSION_NAME="${{ inputs.version_name }}"
COMMIT_SHA="$(git rev-parse HEAD)"
RELEASE_DATE="$(date -u +%Y-%m-%d)"
PRETTY_TAG="v${VERSION_NUMBER}"
echo "pretty_tag=${PRETTY_TAG}" >> "$GITHUB_OUTPUT"
echo "version_number=${VERSION_NUMBER}" >> "$GITHUB_OUTPUT"
echo "version_name=${VERSION_NAME}" >> "$GITHUB_OUTPUT"
echo "commit_sha=${COMMIT_SHA}" >> "$GITHUB_OUTPUT"
echo "release_date=${RELEASE_DATE}" >> "$GITHUB_OUTPUT"

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push image
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: |
ghcr.io/neonspectra/epcc:${{ steps.tags.outputs.pretty_tag }}
ghcr.io/neonspectra/epcc:latest
build-args: |
EPCC_DISPLAY_VERSION=${{ steps.tags.outputs.version_number }}
EPCC_DISPLAY_VERSION_NAME=${{ steps.tags.outputs.version_name }}
EPCC_DISPLAY_COMMIT=${{ steps.tags.outputs.commit_sha }}
EPCC_DISPLAY_RELEASE_DATE=${{ steps.tags.outputs.release_date }}
13 changes: 8 additions & 5 deletions Authors.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
The Eclipse Phase Character Creator credits it's existence to many people who have been kind enough to donate their time to this project.
The Eclipse Phase Character Creator credits its existence to many people who have been kind enough to donate their time to this project.

# Authors
* neon @ neosynth.net [Starting in 2026]
* Neon (neon@neosynth.net) [2026-]

# Inactive Authors:
* Arthur Moore (EmperorArthur) [2015-2021]
* Russell Bewley (rbewley4) [2014-2021]
(with associated GitHub username, where applicable)

* Arthur Moore (EmperorArthur) [403 Commits from 2015 to 2021]
* Nick Clark (nickrbclark) [23 Commits in 2021]
* Russell Bewley (rbewley4) [34 Commits from 2014 to2017]
* AngleOSaxon [Commit 63f56a in 2018]
* Cedric Reinhardt (FullSimplex) [16 Commits between 2014 and 2016]
* Ian Ruotsala (boomzilla) [Commit 2525583 in 2014]
Expand All @@ -15,7 +18,7 @@ The Eclipse Phase Character Creator credits it's existence to many people who ha
* stoogoff [9 Commits in 2015]
* mace666 [Commit c33003b in 2016]

#Authors Pre Version Control (2013-2014):
# Authors Pre Version Control (2013-2014):
* CÉDRIC REINHARDT (GUI, CODE, SQL)
* JIGÉ PONT (CODE, GAME MECHANICS)
* OLIVIER MURITH (GRAPHIC CONCEPT)
18 changes: 14 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# This is meant to run a full version of the creator in standalone mode.
# No external databases or volume mounts required.

FROM node:16-alpine AS node-build
FROM node:24-alpine AS node-build
WORKDIR /app
COPY package.json package-lock.json webpack.mix.js ./
COPY resources ./resources
COPY public ./public
RUN npm install
RUN npm run production

FROM php:7.4-fpm-alpine
FROM php:8.4-fpm-alpine

EXPOSE 80
CMD ["s6-svscan", "/etc/s6"]
Expand All @@ -18,8 +18,8 @@ HEALTHCHECK --interval=1m --timeout=3s \
CMD curl -f http://localhost/ || exit 1

RUN apk add --no-cache nginx sqlite s6 curl unzip git \
&& apk add --no-cache --virtual .build-deps $PHPIZE_DEPS libxml2-dev sqlite-dev oniguruma-dev curl-dev \
&& docker-php-ext-install pdo pdo_sqlite pdo_mysql fileinfo tokenizer dom curl mbstring \
&& apk add --no-cache --virtual .build-deps $PHPIZE_DEPS libxml2-dev sqlite-dev oniguruma-dev curl-dev mariadb-connector-c-dev \
&& docker-php-ext-install pdo pdo_sqlite pdo_mysql fileinfo dom curl mbstring \
&& apk del .build-deps

COPY .docker/s6/ /etc/s6/
Expand Down Expand Up @@ -52,6 +52,16 @@ RUN touch $DB_DATABASE && \
sed -i 's/\\n/ /g' /var/www/html/database/database.sql && \
sqlite3 --init /var/www/html/database/database.sql $DB_DATABASE

# Optional display-only version info (used by /api/version)
ARG EPCC_DISPLAY_VERSION
ARG EPCC_DISPLAY_VERSION_NAME
ARG EPCC_DISPLAY_COMMIT
ARG EPCC_DISPLAY_RELEASE_DATE
ENV EPCC_DISPLAY_VERSION=$EPCC_DISPLAY_VERSION
ENV EPCC_DISPLAY_VERSION_NAME=$EPCC_DISPLAY_VERSION_NAME
ENV EPCC_DISPLAY_COMMIT=$EPCC_DISPLAY_COMMIT
ENV EPCC_DISPLAY_RELEASE_DATE=$EPCC_DISPLAY_RELEASE_DATE

# Set default mode to standalone
RUN mv standalone.env .env && php artisan key:generate

Expand Down
11 changes: 7 additions & 4 deletions Documentation/Database.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
# The Database

The Eclipse Phase Character Creator requries a relational database to work.
It will work with any database that PHP has a [PDO module](https://secure.php.net/manual/en/book.pdo.php) for.
Since, the creator never writes to the database, even NoSQL will work.
The Eclipse Phase Character Creator requires a relational database for read-only data.
It works with any database that PHP has a [PDO module](https://secure.php.net/manual/en/book.pdo.php) for.
Since the creator only reads data, even NoSQL can work if it presents a PDO-compatible layer.

Instructions to set up the database can be found in the [README](../README.md#Deployment) file.
The Docker image and test suite both use the SQLite database built from `database/database.sql`.

It's often convenient to use `sqlite` to test the database. However, `MySQL` will not simply accept an `sqlite` dump file. Some modifications are needed.
## Using SQLite vs MySQL

It's often convenient to use `sqlite` to test the database. However, `MySQL` will not simply accept an `sqlite` dump file. Some modifications are needed.

First, you must delete these two lines from the top of the file:
```text
Expand Down
50 changes: 15 additions & 35 deletions Documentation/User Interface.md
Original file line number Diff line number Diff line change
@@ -1,42 +1,22 @@
# User Interface Documentation

# High Level Design
## High Level Design (post-refactor)

All UI is shown on `index.php`.
User actions are almost all done through ajax calls.
The sole exception to this is file loading, which is still mostly ajax, but uses an iframe to upload the user selected file.
The UI is rendered through Laravel + Vue 3:

## index.php
`index.php` has the following features:
- `resources/views/main.blade.php` is the entry point (formerly `index.php`).
- Vue Router mounts into `#container` and swaps pages (`resources/js/app.js`).
- Modals and UI components live under `resources/js/components`.
- UIkit provides modal behavior and layout classes.
- Most user actions are AJAX calls (Axios) to `/api/*` routes.
- File loading reads JSON locally (`readJsonFile`) and posts to `/api/creator/load` (no iframe).

* 4 vertical content panes.
* Each is at a minimum 20em wide (Total of 80em or ~1280px)
> Note that buttons **can** currently overlap text if the text is too long.
* 1px seperation between each pane
* #primary is on the far left, with #secondary to the right of it, #tertiary to the right of #secondary, and #quaternary to the right of #tertiary
* A #messages alert box
* Centered at the top of the screen
* 25px high
* At least 300px wide
* Displays over almost everything (z-index: 100)
## Layout notes

* A #menu panel containing 7 buttons
* Absolute positioned:
* Bottom, Right of screen
* 100px wide
* 400px heigh
* Each button:
* 100px wide
* 55px heigh
* Text is left aligned
* Oval shaped
- The main layout still uses 4 vertical content panes (`#primary`, `#secondary`, `#tertiary`, `#quaternary`).
- `#messages` is a top-centered alert overlay.
- The menu panel is positioned at the bottom-right with buttons for save/load/validate/export/new/about.
- Stats panel remains top-right.
- Popup modals cover most of the page for detailed actions (UIkit modals).

* A stats panel
* Absolute positioned:
* Top, Right of screen
* 120px wide
* 200px heigh
* Popup windows covering most of the page
* Tooltips when a user hovers over a '?'

Final minimal page dimensions to display everything are 1400 X 630.
Minimal viewport size remains roughly 1400x630 for a no-scroll experience.
24 changes: 22 additions & 2 deletions LICENSE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Copyright (c) 2013-2019
EPCC is a derivative work maintained by [neon](https://neosynth.net/meta/contact/). Except where otherwise noted, the contents of this repo are licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International license](https://creativecommons.org/licenses/by-nc-sa/4.0/).

This work is a derivative work based on [previous work by Arthur Moore and other authors](https://github.com/Eclipse-Phase-Unofficial/ep-character-creator) licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License](https://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US). Changes were made.

The full copyright notice of the prior work is reproduced below:
```markdown
# Copyright (c) 2013-2019
# CC BY-NC-SA 3.0
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to
Expand All @@ -12,4 +17,19 @@ All work done by Arthur Moore is licensed under the GNU Lesser General Public Li
As I have moved many files, they may appear to have my name attached to them, but I am not the original creator. In some cases, I have modified the files, but since the file started as one under the older license, it is licensed under the original CC BY-NC-SA 3.0 License until it is re-written.

# Libraries
This work uses the Laravel, Vue, and other libraries. All of which are licensed under an MIT (or BSD) license. If you believe this work is using a non MIT/BSD licensed library please contact us so we can correct this error.
This work uses the Laravel, Vue, and other libraries. All of which are licensed under an MIT (or BSD) license. If you believe this work is using a non MIT/BSD licensed library please contact us so we can correct this error.
```

---

2026-01-14 Note:

The statement by previous maintainer Arthur Moore indicates that the work done by them is licensed under LGPL, but this is not legally feasible for two reasons:
1. Eclipse Phase is copyright to [Posthuman Studios](https://posthumanstudios.com/), and game contents for every prior iteration of EPCC have been licensed to the community under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (or, in earlier publishings, 3.0 Unported) license. Derivatives of this tool cannot be relicensed under a different license.
2. In practice, you cannot sublicense code contributions to open source projects under both CC and LGPL in this manner because these licenses are not compatible. LGPL is intended for use with libraries, decomposable assets, and atomic subcomponents (not individual contributions).
- Downstream licensees still have to license the original work under the original CC BY-NC-SA license, so what this means is that (legally speaking) any downstream fork from [Arthur Moore's fork](https://github.com/Eclipse-Phase-Unofficial/ep-character-creator) would be beholden to the terms of both LGPL and CC-BY-NC-SA for any downstream forks. This is not possible to do, and thus the license isn't valid.
- This fully invalidates any reason to use a copyleft license like LGPL in the first place because this code now can't technically be licensed by *anyone* under the license as written.

However, as I have no respect for copyright, I am going to choose to disregard Arthur's LGPL notice and make use of this code anyway.

If you are Arthur Moore and you are reading this, I'm assuming that your intent was to use LGPL to create broader copyleft freedoms than those enforced by BY-NC-SA, but in practice you've done the opposite: your contributions cannot be licensed and you hold sole copyright over them. If you are interested in relicensing your contributions correctly as allowed by the original BY-NC-SA license, [hit me up so we can fix this](https://neosynth.net/meta/contact/). Not that it really matters, given that none of us are making any money off this fan tool 😅.
Loading