Projects

  • Pick-Up

    Version 2.0.0-beta Stable 1.3.4 License AGPLv3

    A wonderful digital sign for airport pick-ups and meeting people.

    Overview

    Pick-Up is a progressive web application (PWA) designed to create digital signs for airport pick-ups, ride-sharing, and any situation where you need to display someone’s name prominently. The app automatically adjusts text size to make names as large as possible on the screen, ensuring maximum visibility from a distance.

    The basic usage is straightforward. You can use Pickup, free of charge, and/or install it on your device from:

    https://pickup.contact/

    Or read more below to install it on your own servers.

    Features

    • Auto-scaling text: Names automatically resize to fill the available screen space
    • Editable display: Click on any text to edit it directly
    • URL parameters: Pre-fill information using URL query parameters
    • Customizable appearance:
      • Choose from preset logos
      • Custom background colors and images
      • Configurable title and branding
    • Progressive Web App: Can be installed on mobile devices and used offline
    • Full-screen mode: Toggle fullscreen for maximum visibility
    • Responsive design: Works on all screen sizes and orientations
    • Service Worker: Offline functionality with caching

    Quick Start

    Using the Web App

    1. Basic usage: Open index.html in a web browser
    2. Edit names: Click on the displayed name to edit it
    3. Customize: Click the logo to access settings for colors, background, and branding
    4. Install: Use the install button to add to your home screen on mobile devices

    URL Parameters

    You can pre-fill the display using URL parameters:

    https://pickup.contact/?f=John&l=Doe&c=Welcome!

    Available parameters:

    • f: First name
    • l: Last name
    • n: Full name (overrides first/last name)
    • c: Comment/message

    Examples:

    /?f=John&l=Smith
    /?n=Jane Doe&c=Flight AA123
    /?f=Maria&c=Taxi to downtown

    Installation

    As a PWA

    1. Open the app in a mobile browser
    2. Click the "Install" button when it appears
    3. The app will be added to your home screen and can run offline

    Self-hosted

    1. Clone or download this repository
    2. Serve the files from a web server (required for service worker functionality)
    3. Open in a web browser

    File Structure

    ├── index.html          # Main application
    ├── form.html          # Form component (embedded)
    ├── manifest.json      # PWA manifest
    ├── css/
    │   └── style.css      # Main stylesheet
    ├── js/
    │   ├── pickup.js      # Main application logic
    │   └── service-workers.js # PWA service worker
    ├── images/            # Logo assets
    │   ├── pickup-logo-*.png
    │   └── [preset logos]
    └── fonts/             # Gotham font family

    Customization

    Logos

    The app can includes several preset logos: add your own logos to the images/ directory and update the logo selector in the settings.

    Styling

    The main styles are in css/style.css. Key customizable elements:

    • Font family and sizing
    • Colors and backgrounds
    • Layout and spacing
    • Responsive breakpoints

    Configuration

    Settings are stored in browser localStorage:

    • title: Custom page title
    • logo: Selected logo image
    • bgColor: Background color
    • bgImage: Background image

    Browser Support

    • Modern browsers with ES6 support
    • Service Worker support for offline functionality
    • Canvas API for text measurement
    • CSS Grid for layout

    Development

    Local Development

    1. Serve files from a local web server:
      
      # Python 3
      python -m http.server 8000

    Python 2

    python -m SimpleHTTPServer 8000

    Node.js

    npx http-server

    1. Open http://localhost:8000 in your browser

    Version Management

    The app uses version strings throughout for cache busting:

    • Update version in index.html, js/service-workers.js, and manifest.json
    • Use the dev/bump-version script to automate version updates

    Contributing

    1. Fork the repository
    2. Create a feature branch
    3. Make your changes
    4. Test across different devices and browsers
    5. Submit a pull request

    License

    This project is licensed under the GNU Affero General Public License v3.0 (AGPLv3). See the LICENSE file for details.

    Changelog

    See CHANGELOG.md for version history and updates.

    Support

    For issues and feature requests, please use the project’s issue tracker.


    Perfect for:

    • Airport pickups
    • Ride-sharing meetups
    • Event registration
    • Hotel shuttles
    • Conference attendee pickup
    • Any situation where you need a clear, visible name display
  • WooPUS

    Sell plugin licenses and synchronize the license keys with Plugin Update Server.

  • Web Reel Automated Publishing: it’s a W.R.A.P

    Wrap is a basic CMS, aimed to display mostly galleries of images or videos. The idea is to allow the website maintainer to push media in subfolders. The structure of the websites and the menus is detected automatically.

    It is not intended to be a full-featured CMS. Instead, it allows to automatically publish videos and pictures playlists.

    It is designed for fast, efficient media transmission. Although it is possible to make a pretty beautiful website with this system (and I did), it’s not the goal.

    It is poorly documented, but it works now with PHP7 (and probably 8).

    Installation

    • VERY IMPORTANT: Put this project outside your web directory. It contains unprotected scripts and tools aimed to alter your disk content
    • bin/ tools are not needed for web publishing. They are used to manipulate video files. If you only need to publish ready to use files, you can safely (and should) remove bin/ folder
    • In your apache config, add alias, rules and wrap.php as DirectoryIndex:
      
      Alias /wrap/ /opt/wrap/
      DirectoryIndex index.php index.html /wrap/wrap.php

    <Directory /opt/wrap/> <IfVersion < 2.3> Order allow,deny Allow from all

    = 2.3> Require all granted
    AllowOverride All

    
    * you can place wrap.css and wrap.html in your web root folder to customize layout
    * use themes/bootstrap/page-template.html as base for wrap.html and be sure to
      include all needed shortcodes
    * More on this later...
  • WP Package Updater – composer-ready library

    Used to enable updates for plugins and themes distributed via WP Plugin Update Server.

  • WooCommerce Virtual Less Fields

    Remove address fields on WooCommerce checkout page for orders with only virtual products.

    Ignores products identified as domain names with WooCommerce Domain Names plugin.

  • Apache Logs Monitor for VS Code

    A simple VS Code extension to monitor Apache error logs in the Debug Console.

    Version: 1.0.0-beta3 VS Code: 1.74+ License: ISC

    What it does

    • Shows Apache error logs in VS Code Debug Console
    • Finds Apache sites automatically from /etc/apache2/sites-enabled/
    • Lets you switch between different site logs
    • Basic commands: select, all, stop, list

    Installation

    Quick install (recommended):

    No need to clone the repository, the install script will fetch the needed files.

    curl -fsSL https://raw.githubusercontent.com/magicoli/vscode-apache-logs-monitor/master/install.sh | bash

    Usage

    In the Debug Console, type:

    • select(1,2,3) – pick specific sites to monitor by number
    • all() – show logs from all sites
    • stop() – stop monitoring
    • list() – show available sites

    Requirements

    • Apache with standard Debian/Ubuntu config layout
    • Access to /etc/apache2/sites-enabled/ and log files
    • May need sudo for log file access

    Example

    
    [14:30:45] Starting Apache Logs Monitor...
    [14:30:45] Found sites: example.com, api.example.com
    [14:30:45] Monitoring: /var/log/apache2/example.com_error.log

    select

    1. example.com – /var/log/apache2/example.com_error.log
    2. api.example.com – /var/log/apache2/api.example.com_error.log Choose [1-2]: 2

    [14:31:02] Switching to: api.example.com [14:31:02] [error] [client 192.168.1.100] PHP Notice: Undefined variable

    Development

    git clone https://github.com/magicoli/vscode-apache-logs-monitor.git
    cd vscode-apache-logs-monitor
    npm install
    npm run compile
    npx vsce package

    Use ./dev.sh build to rebuild or ./dev.sh watch for auto-rebuild.

    Notes

    • This is a basic utility extension for Apache log monitoring
    • Works with standard Apache configurations on Debian/Ubuntu
    • For remote servers, install the extension on each server (not your local machine)
    • Uses VS Code’s Debug Adapter Protocol for console integration

    License

    ISC License – see LICENSE file.

  • Sub Categories Widget

    Note: This plugin seems abandoned by it’s original author, so I took over to ensure maintenance if needed.

    Sometimes when you divide up your WordPress content into categories it all ends up in sub-categories of one or two main categories that don’t have any content themselves.

    With the widget you can add a list of sub-categories even if the parent doesn’t have posts.

    You can display and filter sub-categories in various ways:

    • Use the parent category as the widget title
    • Show post counts in bracket next to the name
    • Hide empty sub-categories
    • Add a link to the parent category to the widget title
    • Show the full sub-category tree so it include sub-sub categories and so on as well
    • Display the list as dropdown rather than as links
    • Use the first category of the current post as the parent
    • Exclude one or more sub-categories from the list
    • List the categories in reverse order
  • OpenSimulator REST PHP library and command-line client

    Version 1.0.6 Stable 1.0.6 Requires PHP 7.4 License AGPLv3

    This library allows to communicate with Robust or OpenSimulator instance with rest console enabled.

    It can be used inside a PHP project, or as a command-line client for OpenSimulator grids.

    Available commands can be found here: http://opensimulator.org/wiki/Server_Commands

    Prerequisites

    Remote connection must be enabled in your Robust .ini file.

    Do not leave default values!. You should never need to type username and password manually, so you can safely generate long random strings.

    You must choose a specific port, not already used by another service. It is good practice to limit access to this port to authorized IP addresses only in your firewall settings.

    [Network]
      ConsoleUser = arandomgeneratedstring
      ConsolePass = anotherrandomgeneratedstring
      ConsolePort = 8009
      ; choose a port not already used by another service

    Command-line client

    Download the executable from this repository, make sure opensim-rest-cli is executable and move it to /usr/local/bin/.

    chmod +x /path/to/opensim-rest-cli
    sudo mv /path/to/opensim-rest-cli /usr/local/bin/opensim-rest-cli

    You can run commands like

    opensim-rest-cli /path/to/Robust.ini show info
    opensim-rest-cli /path/to/Robust.ini show regions

    If you save the credentials in ~/.opensim-rest-cli.ini, you can skip the Robust.ini argument.

    opensim-rest-cli show info
    opensim-rest-cli show regions

    PHP class

    Method 1: Install with composer (recommended for standalone projects)

    composer require magicoli/opensim-rest-php

    Then in your PHP code:

    
    require_once 'vendor/autoload.php';

    $session = opensim_rest_session( array( ‘uri’ => "yourgrid.org:8009", ‘ConsoleUser’ => ‘yourConsoleUsername’, ‘ConsolePass’ => ‘yourConsolePassword’, ) );

    if ( is_opensim_rest_error($session) ) { error_log( "OpenSim_Rest error: " . $session->getMessage() ); } else { $responseLines = $session->sendCommand($command); }

    Return value: an array containing the line(s) of response or a PHP Error

    Method 2: Git Submodule + sparse (recommended for integrated projects)

    Setting sparse config is critical to avoid executables being accessible on public website.

    From your project directory:

    
    git submodule add https://github.com/magicoli/opensim-rest-php.git opensim-rest
    cd opensim-rest
    git config core.sparseCheckout true

    echo ‘‘ > $(git rev-parse –git-dir)/info/sparse-checkout echo ‘!bin/‘ >> $(git rev-parse –git-dir)/info/sparse-checkout echo ‘!dev/*’ >> $(git rev-parse –git-dir)/info/sparse-checkout echo ‘!opensim-rest-cli.php’ >> $(git rev-parse –git-dir)/info/sparse-checkout echo ‘!composer.lock’ >> $(git rev-parse –git-dir)/info/sparse-checkout

    git read-tree -m -u HEAD

    This will give you only the files you need:

    opensim-rest/
    ├── class-rest.php
    ├── composer.json
    ├── LICENSE
    └── README.md

    Then in your PHP code:

    require_once dirname(__FILE__) . '/opensim-rest/class-rest.php';
    // Same usage as above

    Method 3: Manual download (not recommended)

    You won’t get updates…

    Download class-rest.php file in your project or

  • OpenSimulator Helpers

    Collection of PHP scripts to enable OpenSimulator features that are not implemented in the core, like search, currency, events in OpenSimulator grids (see Features below).

    Most files are used directly by viewer to allow features not implemented in OpenSimulator, like classifieds, events, etc.

    They were initially based on a collection of different projects (see Credits below), but were entirely rewritten to use an unified code and set of parameters, as well as for integration in larger projects like w4os OpenSim WordPress Interface.

    Formerly known as Flexible Helper Scripts.

  • OpenSimulator Engine

    Version 3.0.0-dev Stable none Requires PHP 7.4 License AGPLv3

    Framework-agnostic PHP library for OpenSimulator grid management

    ⚠️ Important Notice

    This is a pure PHP library – it does nothing by itself!

    The OpenSimulator Engine provides core functionality for managing OpenSim grids, but requires a parent application to function. It handles database operations, configuration management, and OpenSim protocol communication, but provides no user interface or web endpoints.

    📜 Project History

    This library consolidates over a decade of OpenSimulator integration work that was previously scattered across multiple projects. While the dedicated engine repository is recent, the functionality has evolved through years of real-world usage in production OpenSim grids.

    The code has been battle-tested across different implementations before being organized into this reusable, framework-agnostic library.

    🎯 What This Library Does

    • Database Operations – Robust/OpenSim database management
    • OpenSim Protocol – REST API communication with grids
    • Configuration Management – Grid and region settings management and storage
    • Security Functions – Input validation and output escaping
    • Form Generation – Dynamic configuration forms
    • Installation – Process setup automation (initiated by parent)

    🚫 What This Library Does NOT Do

    • ❌ No web interface or HTML pages
    • ❌ No user HTTP request handling
    • ❌ No user authentication
    • ❌ No WordPress or other CMS/framework dependencies
    • ❌ No standalone application functionality

    For Developers:

    • Use this engine to build your own OpenSim management applications
    • Integrate OpenSim functionality into existing PHP projects
    • Create custom grid administration tools

    🚀 Quick Start for End Users

    Don’t install this directly! Instead, choose a complete solution:

    • W4OS WordPress Plugin – Complete WordPress integration for OpenSim grids. Best for: Complete integration in a WordPress website.
    • OpenSim Helpers – Provides mainly helpers/ required by OpenSim grids to function properly, as well as minimal webui features. Best for: Separate helpers management, with minimal integration with the website.

    🛠️ Developer Installation

    As Composer Package

    composer require magicoli/opensim-engine

    As Git Submodule

    git submodule add https://github.com/magicoli/opensim-engine.git engine

    Usage in Code

    
    // Bootstrap the engine
    require_once 'engine/bootstrap.php';
    // or require_once 'vendor/magicoli/opensim-engine/bootstrap.php' if installed via composer

    // Engine provides the core classes and functions // See parent projects (W4OS, Helpers) for implementation examples

    📚 Documentation

    • Developer Guide – Architecture rules and patterns
    • API Reference – (planned after migration completion)
    • Examples – (planned after migration completion)

    🤝 Contributing

    This library follows strict architectural principles:

    • Framework-agnostic (no WordPress, no Laravel, etc.)
    • Pure data processing (no HTTP input/output)
    • Explicit data passing (no global variables)

    See DEVELOPERS.md for complete guidelines.

    Note: The library is undergoing architectural migration. API documentation and examples will be added once the refactoring is complete and the API is stable.

    📄 License

    AGPLv3 – See LICENSE file for details.

    🆘 Support