Vigi Spray - Ultimate Urban Art System
The most advanced, high-performance graffiti system available for FiveM. Freehand paint, stencils, masking tape, mirror mode, live sync, and a full admin panel.
SHOWCASE VIDEO | DOCUMENTATION
CREATIVE TOOLS
Spray Painting
- Freehand Drawing: Paint on any flat surface with full mouse control
- Live Multiplayer Sync: Watch other players create art in real-time
- Color System: Full spectrum picker with presets, hex input, recent colors, and favorites
- Pressure Mechanics: Shake the can to build pressure, sputtering effect when running low
- Adjustable Cap Size: Scroll to change stroke width from thin to fat cap
- Depth Adjustment: Scroll to offset the graffiti from the wall, fixing Z-fighting on uneven surfaces
Precision Tools
- Masking Tape: Create clean straight lines with angle snapping (45-degree increments)
- Mirror Mode: Place a symmetry axis and every stroke is reflected in real-time
- Rule of Thirds Grid: Toggle an overlay grid for composition and scaling
- 3D Dimensions Display: See the exact size of your work area while placing it
Edit Mode
- Re-Edit Your Work: Aim at your own graffiti and re-enter the canvas to continue drawing
- Non-Destructive: Your existing artwork is loaded back onto the canvas
- Ownership Check: Only the original creator can edit (admins can lock tags to prevent editing)
Stencils & Sketchbook
- Stencil Gallery: Browse and place admin-managed designs with a progressive spray reveal animation
- URL Import: (Optional) Players paste an image URL to place it directly, with domain whitelist/blacklist and cooldowns
- Player Access Control: Restrict specific stencils to specific players
- Local Sketchbook: Players save drawings locally and reuse them across sessions
Cleaning
- Sponge System: Progressive erasure with a physical sponge animation
- Durability & Wear Widget: Sponges degrade over time with a real-time visual indicator (cyan > orange > red)
- Locked Tags: Admins can lock graffiti to prevent cleaning
PERFORMANCE
- Atlas Rendering: All visible tags share a single GPU texture atlas for minimal draw calls
- Camera-Side Face Culling: Only the face visible to the player is rendered (2 draw calls instead of 4 per tag)
- Debounced File I/O: Rapid operations are batched to reduce disk writes
- Latent Event Streaming: Large images synced via chunked events, no network bottleneck
- WebP Compression: All artwork stored in WebP for optimal quality-to-size ratio
- Data Integrity Check: Automatic cleanup of orphaned files on server start
- Zero Dependencies: Completely standalone, no xSound or external libraries
- 3D Spatial Audio: Distance-based sound built entirely within NUI
ADMIN PANEL
Management
- Dashboard: Total graffiti, active artists, daily creation stats
- Interactive World Map: Leaflet.js map with clustering, switchable Atlas/Satellite/Roads views
- Search & Filter: Find tags by artist, date, ID, or distance from your position
- Bulk Delete: Select multiple tags and delete them in a single batch
- Click-to-Delete: Aim and click to remove tags directly in the game world
- Admin Depth Adjustment: Select any tag and scroll to fine-tune its wall offset
- Tag Locking: Lock tags to prevent player editing and cleaning
- Stencil Library: Add, rename, import, delete stencils, and manage per-player access
- Discord Webhooks: Every creation logged with artist info, coordinates, and image preview
Permissions & Security
- ACE Permissions: Restrict spraying to specific FiveM groups
- Job & Boss Grade: Allow only specific jobs or boss ranks
- Discord Role Check: Restrict to specific Discord roles
- External Export: Hook into any custom permission resource
- Restricted Zones: Define polygon areas where graffiti is forbidden
- Blacklist System: Ban/unban players via Discord ID, License, or Server ID
COMPATIBILITY
Frameworks
- ESX: Legacy & Extended, all versions
- QBCore: Full support
- Qbox: Compatible
- Auto-Detection: Framework and inventory detected automatically
- Custom Framework: Open bridge files for any implementation
Inventory Systems
- ox_inventory | qs-inventory | qb-inventory | codem-inventory | chezza-inventory | ESX default
- Command Mode: Works without any inventory (
/spray,/sponge)
Integrations
- OP Gangs (op-crime): Native territory integration, loyalty rewards, rival penalties
- Custom Scripts: Server events and exports for police alerts, gang systems, economy, etc.
Languages
- 9 Languages: English, French, Spanish, German, Italian, Portuguese (PT & BR), Russian, Arabic
API
-- Client Exports
exports['vigi_spray']:IsSprayMode()
exports['vigi_spray']:OpenAdminPanel()
exports['vigi_spray']:OpenStencilGallery()
exports['vigi_spray']:GetNearbyTags(radius)
exports['vigi_spray']:SetGraffitiHidden(bool)
exports['vigi_spray']:IsGraffitiHidden()
-- Server Exports
exports['vigi_spray']:DeleteTag(tagId)
exports['vigi_spray']:DeleteClosestTag(coords, radius)
exports['vigi_spray']:GetNearbyTags(coords, radius)
exports['vigi_spray']:GetTagInfo(tagId)
exports['vigi_spray']:IsStencilTag(tagId)
exports['vigi_spray']:GetAllStencils()
-- Server Events
vigi_spray:server:onTagCreated
vigi_spray:server:onTagCleaned
CONFIGURATION
Everything is configurable via a single config.lua:
Config.Framework = "auto" -- Auto-detects ESX / QBCore / Qbox
Config.Inventory = "auto" -- Auto-detects your inventory system
Config.Items = { sprayCan = "spraycan", sponge = "sponge" }
Config.MaxActiveTags = 24 -- Simultaneous rendered tags
Config.SlotResolution = 768 -- Per-tag resolution (512/768/1024/2048)
Config.RenderDistance = 100.0 -- Visible range in meters
Config.ImageQuality = 0.85 -- WebP compression quality
Config.TagExpirationDays = 0 -- Auto-delete old tags (0 = never)
Config.Permission.enabled = true -- ACE, jobs, Discord roles, external
Config.Discord.enabled = true -- Webhook logging with images
Open Files
- config.lua: All settings
- client/bridge.lua & server/bridge.lua: Framework & inventory customization
- locales/*.lua: Full translation system (9 languages)
- gangs/op_gangs.lua: OP Gangs integration