// The canvas code, especially useful for external sites to know that the canvas has rolled over canvascode: "1" server { port: 4567 // The directory the server places board files and backups in storage: . // If you're using a reverse proxy, you need to set this up to identify the users' real IPs // If the connecting client's IP matches "server.proxy.localhosts", it will look up each header in the "headers" field // in sequence until it finds a non-local IP, and will use that IP throughout for rate limiting and storage proxy { // If you have a custom load balancer, reverse proxy, DDoS protector, etc, put its IP in here localhosts: ["127.0.0.1", "0:0:0:0:0:0:0:1"] headers: [] } limits { // time is a rate limit time frame // count is how many times a request can be made in that time frame before 429ing signup { count: 4 time: 1h } auth { count: 3 time: 10m } lookup { count: 20 time: 2m } undo { count: 3 time: 1m } chat { count: 2 time: 1s } chatColorChange { count: 2 time: 45s } discordNameChange { count: 2 time: 45m } manageFactions { count: 1 time: 2s global: false } } } webhooks { announcements: "" } html { title: Pxls head: "" info: "public/pebble_templates/info.html" faq: "public/pebble_templates/faq.html" } // Full links to legal pages legal { termsUrl: "" privacyUrl: "" } database { user: "" pass: "" // The JDBC URI, of the format "jdbc:postgresql://:/" // database will add "?allowMultiQueries=true" so make sure nothing is inserted after // example: "jdbc:postgresql://localhost:5432/pxls" url: "" } pixelCounts { countTowardsAlltime: true, countTowardsCurrent: true } board { width: 1000 height: 1000 // See cooldown below heatmapCooldown: 3h saveInterval: 5s backupInterval: 5m } // Cooldown types // static: cooldown is always the same // activity: cooldown increased with the amount of authed users online // any other value defaults to "static" cooldownType: activity staticCooldown { // See https://github.com/typesafehub/config/blob/master/HOCON.md#duration-format // raw numbers will be interpreted as milliseconds time: 1m } activityCooldown { // follows the formula: (steepness * sqrt(userCount + userOffset) + globalOffset) * multiplier // https://www.desmos.com/calculator/sgphb1abzi globalOffset: 6.5 userOffset: 11.96 steepness: 2.5 // This multiplies the final cooldown in seconds multiplier: 1 } undo { window: 5s } selfPixelTimeIncrease: true // Cooldown multiplier for placing on non-background pixels backgroundPixel { enabled: true // This multiplies the final cooldown in seconds multiplier: 1.6 } // System host, used for various things, including auth. MUST be set correctly or you'll have a bad time trying to debug auth. Should be set to your domain - or IP if testing locally - without port. host: "" captcha { enabled: false // Captcha will show rougly 1/ times threshold: 5 key: "" secret: "" maxPixels: 0 allTime: true } stacking { cooldownMultiplier: 3, maxStacked: 5 } whoamiAllowedOrigins: [ "https://pxls.space" ] oauth { useIp: false // Hides usernames from lookups, chat, etc. An anonymous mode without relying on useIp which messes with moderation. snipMode: false // Should be your url + /auth (for example, http://pxls.space/auth) callbackBase: "" enableRegistration: true // Create at https://www.reddit.com/prefs/apps reddit { key: "" secret: "" minAge: 1d enabled: true registrationEnabled: true } // Create at https://console.developers.google.com/ google { key: "" secret: "" enabled: true registrationEnabled: true } // Create at https://discord.com/developers/applications/me discord { key: "" secret: "" minAge: 1d enabled: true registrationEnabled: true } // Create at https://vk.com/apps?act=manage vk { key: "" secret: "" enabled: true registrationEnabled: true } // Create at https://www.tumblr.com/oauth/apps tumblr { key: "" secret: "" enabled: true registrationEnabled: true } // Create at https://dev.twitch.tv/console/apps/create twitch { key: "" secret: "" enabled: true registrationEnabled: true } } textFilter { enabled: true static: [] regex: ["n([i1]+)g+([e3a4])[2r]?[5sz]?", "f[a4]g+[sz5]?([o0][7t]+)?", "k[1i]+k[e3]+[5sz]?"] //"n****r, f****t, k**e" and their short/1337/plural alternatives } chat { enabled: true trimInput: true defaultColorIndex: 5 characterLimit: 256 canvasBanRespected: false showShadowBannedMessagesToStaff: true chatLookupScrollbackAmount: 500 // Minimum pixel count for the user to be able to send links in chat // 0 = disabled linkMinimumPixelCount: 0 // Whether to send the link to staff if it's below the minimum pixel count // This is useful for moderation linkSendToStaff: false customEmoji: [ // Emoji only support a-z, A-Z, _, and -. // No two emoji may have the same name, this is case insensitive. // For Example, TrueTrue cannot coexist with truetrue, but they can exist seperately. // Every emoji must have a corresponding image in `/emoji`, by default `./emoji`. // Example: { name: "kek", emoji: "kek.png" } ] bannerText: [ "[fab.fa-discord.fa-is-left] Official Discord: [Invite Link](https://pxls.space/discord)", "[fas.fa-gavel.fa-is-left] Read the chat rules in the info panel.", "[fas.fa-question-circle.fa-is-left] Ensure you read the FAQ top left!" ] publicWebhooks: [ // a list of strings // Example: "https://discord.com/api/webhooks/1234567890/abcdef_09876" ] staffWebhooks: [] // Relative time is appended to this string // For example: Please wait a few seconds ratelimitMessage: "Please wait " } userIdleTimeout: 30m factions { maxTagLength: 5 maxNameLength: 60 maxOwned: 4 minPixelsToCreate: 1000 // all-time allowedCharacterRanges: [ [0x0000, 0x007F], // basic latin [0x00A1, 0x024F], // subset of latin-1 supplement (printables, no controls) [0x0400, 0x04FF], // cyrillic [0x0500, 0x052F], // cyrillic supplement [0x2122], // (tm) [0x2010, 0x2014], // various dashes [0x2018, 0x201F], // double and single quote marks [0x2026], // ellipsis [0x203D], // interrobang [0x20AC], // Euro symbol [0x20BF], // Bitcoin symbol [0x2150, 0x215E], // fractions such as 1/7 and 3/5 [0x2190, 0x2199], // simple arrows [0x231A, 0x231B], // watch, hourglass from misc technical [0x23EA, 0x23FA], // more emoji from misc technical [0x2600, 0x27BF], // misc symbols (♥), dingbats (sparkle, heavy heart) [0xFE00, 0xFE0F], // variation selectors (heart color) [0x1F000, 0x1FAFF] // emoji ] } cors { // You should host your own proxy and link to it here. // Public cors proxies are unreliable and usually not intended for deployed use. // see https://github.com/Rob--W/cors-anywhere/issues/301 for why the default here will not work proxyBase: "https://cors-anywhere.herokuapp.com" // If your proxy takes the URL as an http parameter, set this to the name of the parameter proxyParam: "" }