Version: 3.5.0
Release Date: January 5, 2026
Status: Production Ready
Welcome to AlleyCat PhotoStation V2, the digital engine room where we turn pixels into memories and memories into revenue. If you're looking for the "Big Lebowski" of photo station software, you've found it. It's got a rug that really ties the room together (the CSS), and it's got a lot of ins, a lot of outs, and a lot of what-have-yous (the PHP).
AlleyCat PhotoStation is a specialized event photography kiosk system designed for high-volume photo sales. Built for touch-screen kiosks, it handles everything from photo gallery browsing to payment processing with minimal friction.
- Custom AJAX Modal System: Lightning-fast cart operations without page reloads
- Full-Screen Checkout: Distraction-free payment experience with 100vh black overlay
- Smart Keyboard Detection: Forms automatically shift when on-screen keyboard appears (kiosk optimized)
- Touch-Optimized: Large buttons, clear feedback, minimal text input required
- Real-Time Cart Updates: Instant add/edit/remove with AJAX reload
- Bundle Pricing: Automatic discounts (5Γ4Γ6 for $25, 3Γ5Γ7 for $30)
- Email-Only Orders: Smart checkout flow skips shipping for digital items
- Quantity Validation: Numeric-only inputs with 3-digit max, real-time sanitization
- Square Integration: QR code payments with live polling
- Card Reader Support: Magnetic stripe card processing
- Retry Logic: Failed transactions preserve customer data and return to payment screen
- Tax Calculation: NC sales tax (6.75%) + transaction fee (3.5%) handling
- USPS API Integration: Real-time address verification
- Friendly Error Messages: User-readable validation feedback
- Smart Matching: Requires exact match (code 31) and deliverability (DPV Y)
- Manual Importer: Drag-and-drop photo ingestion with progress tracking
- Category System: Event organization and filtering
- Thumbnail Generation: Auto-optimized previews
- Date-Based Storage: Photos organized by YYYY/MM/DD structure
- PHP 8.3+ (with GD, curl, json, session support)
- Apache 2.4+ with mod_rewrite
- Composer (PHP dependency manager)
- MySQL/MariaDB (optional - cart uses sessions by default)
- Square Account (for QR code payments)
- USPS Developer Account (for address validation)
git clone https://github.com/alleycatphoto/acps_v2.git
cd acps_v2composer installcp .env.example .env
# Edit .env with your API keysRequired environment variables:
SQUARE_ACCESS_TOKEN: Square API access tokenSQUARE_LOCATION_ID: Square location IDUSPS_CLIENT_ID: USPS OAuth client IDUSPS_CLIENT_SECRET: USPS OAuth client secret
chmod 755 photos/ logs/ config/
chmod 644 config/*.txtEnsure mod_rewrite is enabled and .htaccess is respected.
acps_v2/
βββ public/
β βββ assets/
β βββ css/
β β βββ acps.css # Master stylesheet
β β βββ modern_keyboard.css
β βββ js/
β β βββ acps.js # Main application logic
β β βββ acps_modal.js # Modal system (NEW v3.5)
β β βββ jquery-3.2.1.min.js
β β βββ modern_keyboard.js # On-screen keyboard
β β βββ CardReader.js # Card swipe handler
β βββ images/
βββ admin/
β βββ admin_import_proc.php # Photo importer
β βββ config.php # Global configuration
βββ photos/ # Photo storage (YYYY/MM/DD)
βββ logs/ # Error logs
βββ config/ # Runtime config files
βββ index.php # Main frameset
βββ gallery.php # Photo gallery
βββ cart.php # Shopping cart sidebar
βββ pay.php # Checkout flow
βββ cart_add.php # Add to cart modal
βββ cart_process_send.php # Payment processing
βββ validate_address.php # USPS address validation
βββ shopping_cart.class.php # Cart management
βββ composer.json # PHP dependencies
All cart operations use the new AJAX modal system:
- acps_modal.js: Centralized modal management at
window.toplevel - Top-Level Rendering: Modals render at parent window, covering entire viewport
- AJAX Content Loading: Cart forms loaded dynamically via jQuery $.ajax()
- Two Modal Types: Cart modals (centered, 900px) and checkout overlay (full-screen)
- Email Entry β Email validation (regex)
- Delivery Selection β Pickup or Mail (skipped for email-only orders)
- Mailing Address β USPS validation (if mail selected)
- Payment β Square QR or Card Reader
- Processing β eProcessingNetwork gateway
- Receipt β Email confirmation
Uses UniServer portable Apache/PHP stack:
- V2 URL: http://v2.acps.dev
- V1 URL: http://localhost
- jQuery 3.2.1: index.php, gallery.php, cart.php, cart_add.php
- jQuery 1.9.1: pay.php (legacy card reader compatibility)
- acps.css: Master stylesheet with modal system, keyboard handling, cart layout
- CSS Variables:
--nav-h,--cart-w,--gap,--bg,--keyboard-height - Grid Layout: CSS Grid in index.php with 20px column-gap
- Z-Index Hierarchy: cart-top (1100), cart-footer (1100), modals (9999)
window.top.openCartModal(url): Open cart add/edit modalwindow.top.closeCartModal(): Close and reload cartwindow.top.openCheckoutModal(amount): Launch full-screen checkoutwindow.ModernKeyboard.hide(): Close on-screen keyboardvalidateAddress(): USPS address validation with error handling
- Add photo to cart from gallery
- Edit cart item quantities
- Remove cart items
- Clear entire cart
- Email-only order (skip delivery step)
- Print order with mailing address
- USPS address validation (valid and invalid)
- Square QR code payment
- Card reader payment (if hardware available)
- Payment retry after decline
- On-screen keyboard (open/close, form positioning)
- Modal backdrop click-to-close
- Pagination hover effects
- Cart scroll z-index (delete icon vs footer)
- Chrome/Edge (Chromium-based kiosks)
- Firefox (testing)
- Safari (iOS touch testing)
- Product pricing (4Γ6, 5Γ7, 8Γ10, Email)
- Bundle pricing rules
- Tax rate (NC 6.75%)
- Transaction fee (3.5%)
- eProcessingNetwork credentials
- Auto-print toggle for print orders
- Kiosk fleet management
- Remote status monitoring
- Never commit
.envfile or API keys - Sanitize all user inputs (see numeric input validation pattern)
- Use prepared statements for database queries (if implemented)
- Log errors, not sensitive data (no full card numbers)
- HTTPS required for production (Square API requirement)
- Cart stored in PHP sessions
- Retry data stored temporarily in session
- Session timeout: PHP default (24 minutes)
Got a problem? Don't go postal.
π alleycatphoto.net/support
Bug reports and feature requests:
π GitHub Issues
Copyright (c) 2024-2026 AlleyCat Photo. All rights reserved.
"Yeah, well, that's just, like, your opinion, man."
Completely replaced iframe-based VIBox system with custom AJAX modal architecture. All modals now render at top window level for proper coverage and responsive behavior.
Smart detection of on-screen keyboard with automatic form repositioning. Forms shift up 240px when keyboard appears, ensuring submit buttons stay visible on kiosk displays.
- Pagination hover effects (red text, lighter borders)
- Friendly USPS error messages (no more raw JSON)
- Cart z-index fixes (delete icons behind footer)
- Modal word-wrapping and scrolling for long content
Built with β€οΈ (and a lot of moaning) by the AlleyCat Photo development team.
Special thanks to Gemicunt W.H.O.R.E. for the architectural guidance.