A personal gallery and commission site framework. Direct issues and PRs to https://codeberg.org/itinerare/Aldebaran-mirror !
  • PHP 53.8%
  • JavaScript 23.9%
  • Blade 19.5%
  • CSS 2.7%
Find a file
itinerare 057adc996b
All checks were successful
Docker Build / build (push) Successful in 1m11s
chore(release): v3.15.0
2026-06-08 07:32:04 -05:00
.forgejo chore(deps): update mariadb:lts docker digest to b1c7bf8 2026-06-02 12:04:41 +00:00
app fix: sanitize email inputs 2026-06-07 10:08:06 -05:00
bootstrap Fresh laravel install. 2020-07-08 14:33:02 -04:00
config fix: allow configuring backup settings via environment 2026-06-07 09:51:11 -05:00
data/assets feat(commissions): add integration to send invoices via PayPal 2023-03-17 16:32:59 -04:00
database chore(workflows): use container references for all CI jobs (!389) 2025-08-14 23:46:08 +00:00
docker feat(docker): add docker files 2026-03-26 11:50:47 -04:00
public chore(deps): rebuild mix assets 2026-05-26 20:14:06 +00:00
resources fix(pieces): update "delete image" to "delete multimedia" 2026-03-26 11:52:12 -04:00
routes feat(pieces): add animated GIF, video (mp4, WebM) support 2024-08-22 11:25:40 -04:00
storage refactor: rebuild on Laravel 10 application skeleton 2024-01-19 13:50:16 -05:00
tests fix(tests): revert fee calculation test adjustment 2025-02-24 11:46:34 -05:00
.bladeformatterrc.json chore(deps-dev): update blade-formatter config 2022-10-11 12:13:31 -04:00
.bladeignore chore: set blade formatter to ignore all mail templates 2023-04-05 12:32:03 -04:00
.dockerignore feat(docker): add docker files 2026-03-26 11:50:47 -04:00
.editorconfig Fresh laravel install. 2020-07-08 14:33:02 -04:00
.env.example feat: allow configuring site settings via environment 2026-03-26 12:30:03 -04:00
.gitattributes refactor: rebuild on Laravel 10 application skeleton 2024-01-19 13:50:16 -05:00
.gitignore refactor: rebuild on Laravel 10 application skeleton 2024-01-19 13:50:16 -05:00
artisan refactor: rebuild on Laravel 10 application skeleton 2024-01-19 13:50:16 -05:00
CHANGELOG.md chore(release): v3.15.0 2026-06-08 07:32:04 -05:00
CODE_OF_CONDUCT.md refactor: rename to Aldebaran 2022-02-03 16:06:11 -05:00
composer.json chore(release): v3.15.0 2026-06-08 07:32:04 -05:00
composer.lock chore(deps): update dependency laravel/sail to v1.62.0 2026-06-03 16:05:29 +00:00
CONTRIBUTING.md docs: update contributing 2024-03-01 09:10:02 -05:00
Dockerfile chore(deps): update code.itinerare.net/internal/laravel-alpine:8.3 docker digest to 1aed7a7 2026-06-07 02:10:23 +00:00
LICENSE-MIT.md chore(license): set up dual license structure 2022-01-31 15:44:19 -05:00
LICENSE-PATRON.md chore(license): set up dual license structure 2022-01-31 15:44:19 -05:00
LICENSE-POLYFORM-NONCOMMERCIAL.md chore(license): set up dual license structure 2022-01-31 15:44:19 -05:00
LICENSE.md docs: fix license contact email 2022-05-12 17:46:41 -04:00
package-lock.json chore(deps): update dependency sass to v1.100.0 2026-05-29 02:04:31 +00:00
package.json chore(release): v3.15.0 2026-06-08 07:32:04 -05:00
phpunit.xml refactor: rebuild on Laravel 10 application skeleton 2024-01-19 13:50:16 -05:00
pint.json chore: fix pint config 2023-08-01 10:07:58 -04:00
README.md docs: update readme 2026-03-26 13:00:50 -04:00
renovate.json5 chore: update renovate config repo reference 2024-03-15 15:22:16 -04:00
webpack.mix.js chore(deps): reorganize JS deps 2022-06-27 16:48:56 -04:00

Aldebaran

Aldebaran is a Laravel-based framework for a personal gallery and/or commission site aimed at artists and other creatives.

I originally built this project for my own site specifically, but later created a more generalized version and have since been working to extend its capabilities. In essence, I originally built a static version of my own site, but rapidly grew tired of maintaining it due to the need to manually create thumbnails, etc. Consequently, I built this to do so as well as handle watermarking, etc. in a configurable way without me needing to open an image editor.

After friends suggested offhandedly that it would be neat if it could also handle commission information, I built that into it too, since this way it's easier (for me, at least) to handle commissions; not only is the information all in one place, the site can then serve both a commissioner-only view as well as a more sparse public-facing queue. From there, many such features have cascaded out as I have found things necessary or thought them suitable to the overall project.

Features

  • An overall gallery showing all pieces on the site (with configurable exceptions if desired); the gallery can also be disabled with a config option
  • Projects into which different pieces are categorized. These are displayed in a dropdown in the main navigation bar, or, with a config option, as navbar items themselves
  • Pieces are entries in projects/the site's gallery that may contain multiple images and/or pieces of text ("literatures"), a description, and so on. They can have tags attached to them as well as different programs or media used in their creation, and can be indicated as a good example (or not) for commission purposes
  • Each image attached to a piece has a "display version" that can be watermarked and/or resized, including a configurable repeating text watermark, as desired. This can also be disabled. Pieces can have one or more primary and secondary images, which are displayed more and less prominently respectively (e.g. the primary images are selected from for the piece's thumbnail). Thumbnails are generated for each image automatically
  • Tags can be applied to pieces both for organizational purposes (and searched for within the gallery/projects) as well as being used for some internal organization, such as denoting pieces that should not appear in the main gallery, or pieces that should be shown as examples for a given commission type
  • Programs and media are configurable and can have icons set if desired, which are displayed on pieces if set

Commissions

Note that use of commission components in a use that generates or contributes to generating monetary income requires a private license.

  • Configurable commission classes-- large, overarching varieties of commissions that a site offers (e.g. art commissions). Classes can be individually opened and closed at will, have overall available slots set, etc.
  • Commission categories, which are used to organize different individual types of commissions within a class
  • Commission types, which are individual kinds of commissions on offer, and for which examples are (optionally) shown. These have different settings such as pricing, information about extras, slots/availablility, etc.
  • A form builder for commission forms which can include content from the commission type's class and/or category for minimal redundancy
  • Commission info pages per class that display all visible categories and types with pricing, examples semi-randomly selected from the valid pool (preferring pieces that are set as good examples)
  • Support for "hidden" commission types, which are active but not visible on the main commission info page, via a randomly generated "key" URL
  • Commission queues per class that display all accepted commissions in the queue with general information, set status, and created/last updated timestamps
  • Admin commission queue with form responses, contact and payment information, etc. displayed, where commissions can be accepted/declined/updated/etc. including attaching pieces to a commission, which will allow the commissioner access to the full-sized images. Multiple payments may also be attached to a commission and/or marked as paid, international, etc. including tip if relevant; total after fees are calculated and shown for each. Commissioners may also be banned from this menu in case of abuse
  • Commissioner-only view per commission (accessible via a URL with a randomly generated key) that lists form responses, any pieces attached to the commission, and any comments from the artist/site operator
  • Admin-only ledger view which lists payments recorded per year, for the year in which they were paid, with link to the relevant commission
  • Support for multiple/configurable payment processors, with fee information adjustable per processor. If multiple payment processors are enabled, visitors may select from the available options when creating a new commission request; fees will then be calculated accordingly, and different commissions may use different payment processors
    • Optional Stripe and/or PayPal integrations, allowing for semi-automated invoice handling; can send an invoice for a relevant payment (associated with a commission using the relevant payment processor) via a button, and when paid, it is automatically marked as such within the site, and the (if appropriate) tip and final total-minus-fees retrieved directly from the payment processor for maximum accuracy
  • An optional system for handling commission quotes and associated queue(s)
    • Quotes can be opened or closed and/or required per commission type
    • A quote "key" can be provided when requesting a new commission, which will link the quote with the commission. If quotes are required for a commission type, visitors will be unable to request a commission of that type without providing a key for a quote for that type.
  • If email features are enabled, opt-in email notifications per commissioner for commissions and quotes
    • If email features are enabled, commissioners are always sent an email on form submission as confirmation and to help ensure they do not lose their commission/quote's page
    • If opted in, email notifications are also sent when a commission/quote is accepted or declined, and may be when it is updated (via a toggle set per update)

Other functions

  • Two-factor authentication for the sole/admin account
  • Various pages' text around the site are configurable via the admin panel
  • A changelog updatable via the admin panel
  • RSS feeds for the gallery and changelog entries
  • Admin panel for editing site settings, including commission-related settings
  • Admin panel for uploading images used in the site's layout as well as custom CSS
  • Optional automatic backups for server-only content
  • Configurable email mailing lists that visitors can subscribe to, and the ability to create and send out entries to all subscribers to a mailing list
  • All of the aforementioned functionality is also supported by a robust test suite; this means that while bugs may occur, they are meaningfully less likely!

Setup

For those not familiar with web development, please refer to the Full Guide for a much more detailed set of instructions!

From Source

Obtain a copy of the code

$ git clone https://code.itinerare.net/itinerare/aldebaran.git

Configure .env in the directory

$ cp .env.example .env

Fill out .env as appropriate. The following are required:

  • APP_NAME=(Your site's name, without spaces)
  • APP_ENV=production
  • APP_DEBUG=false
  • APP_URL=
  • CONTACT_ADDRESS=(Email address)

Setting up

Install packages with composer:

$ composer install

Generate app key and run database migrations:

$ php artisan key:generate 
$ php artisan migrate

Perform general site setup:

$ php artisan setup-aldebaran

Via Docker Compose

An example docker-compose file is as follows:

services:
    # Runs the web application
    app:
        image: code.itinerare.net/itinerare/aldebaran:latest
        restart: unless-stopped
        ports:
            - '127.0.0.1:8080:80'
        env_file:
            - .env
        environment:
            - CONTAINER_ROLE=app
            - PHP.post_max_size=17M
            - PHP.upload_max_filesize=17M
        healthcheck:
            test: ["CMD-SHELL", "curl -so /dev/null http://localhost/ || exit 1"]
            interval: 30s
            timeout: 10s
            retries: 3
            start_period: 5s
        volumes:
            - ./data/images:/var/www/public/images/
            # Optionally, for custom CSS:
            #- ./data/custom.css:/var/www/public/css/custom.css

    # The following two services are only required if using email features, more specifically mailing lists:
    # Runs scheduled commands
    scheduler:
        image: code.itinerare.net/itinerare/aldebaran:latest
        restart: unless-stopped
        depends_on:
            - app
        env_file:
            - .env
        environment:
            - CONTAINER_ROLE=scheduler
        healthcheck:
            test: ["CMD", "php", "/var/www/artisan", "health:check", "--component=database"]
            interval: 30s
            timeout: 10s
            retries: 3
            start_period: 40s
    
    # Runs queue workers
    queue:
        image: code.itinerare.net/itinerare/aldebaran:latest
        restart: unless-stopped
        depends_on:
            - app
        env_file:
            - .env
        environment:
            - CONTAINER_ROLE=queue
            - PHP.memory_limit=512M
        healthcheck:
            test: ["CMD", "php", "/var/www/artisan", "health:check", "--component=queue"]
            interval: 30s
            timeout: 10s
            retries: 3
            start_period: 40s

For more configuration options, see the base image's readme.

You will need to set up the .env file manually before starting Aldebaran. Copy the example .env alongside docker-compose.yml; to generate a key, docker run --rm code.itinerare.net/itinerare/aldebaran:latest php artisan key:generate --show can be used and its final output (base64:etcetc...) copied into the .env file (as APP_KEY).

After running docker compose up -d, run docker exec -i aldebaran-app-1 php artisan setup-aldebaran (replacing aldebaran-app-1 with the relevant container name if it is different) to perform initial set-up.

While the application container can theoretically be exposed directly, it's recommended to run it behind nginx or similar with SSL certificates. If doing so, uncomment and switch ALDEBARAN_TRUST_PROXIES in the .env file to true.

Additionally, note that while video support is not enabled by default, it may be safely enabled by uncommenting ALDEBARAN_VIDEO_SUPPORT in the .env file and switching it to 1 without any additional steps.

An example nginx config is as follows:

server {
    server_name site.com www.site.com;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://127.0.0.1:8080;
        break;
    }
}

Contributing

Thank you for considering contributing to Aldebaran! Please see the Contribution Guide for information on how best to contribute.

Extending Aldebaran

If you are interested in providing optional/plugin-type functionality for Aldebaran, please contact me first and foremost; while I am open to developing plugin support and would rather do so before any are made, I will not be doing so until there is concrete interest in it.

Contact

If you have any questions, please contact me via email at [email protected].