docs.sexcaller.lol / Docs

Documentation

Everything you need to build and customize your guns.lol profile page.

Like this project? Visit my profile on guns.lol/500 or sexcaller.lol — drop a view, it helps a lot.

Disclaimer: This is a fan-made clone of a guns.lol profile page. It is missing many features and layouts from the real site. I am not responsible for what you do with this code. Build on it, extend it, break it — it's yours now.

What is this?

A fully customizable guns.lol profile page clone built with vanilla HTML, CSS, and JavaScript. No frameworks, no build tools. Everything controlled from src/js/config.js.

Zero server required. Edit config.js, refresh the browser, see changes instantly.

Features

5 Layouts Default, stacked, compact, minimal, glass
12 Badges With tooltips and custom colors
Typewriter Bio Cycle through multiple texts
Audio Player Inline player with playlist support
7 BG Effects Aurora, stars, snow, rain, plasma, fireflies, dither
4 Mouse Effects Trail, particles, glow, ripple
3D Tilt Interactive card rotation on hover
Theme Presets Dark, light, neon, ocean, or custom
Custom Cursor Replace the system cursor
Extra Sections Location, about, portfolio
Shuffle Text Matrix-style animation on username
Profile example
Default profile (Sixfy) with splash, badges, links, typewriter bio
Getting Started

Quick Start

From zero to a fully customized profile in under two minutes.

No build step, no npm install, no server required. Edit a config file, refresh the browser, see changes instantly.

1. Get the project

Clone or download the repository. The project is a flat file structure — no framework, no bundler.

git clone https://github.com/6sfy/guns.lol.git
cd guns.lol

2. Open the config file

All configuration lives in src/js/config.js. Open it in any text editor.

3. Set your identity

Change the display name and user ID to your own.

const CONFIG = {
  username: "YourName",
  uid: "12,345",
  joinedDate: "Joined 3 months ago",
  // ...
};

4. Add badges

Badges appear beneath your avatar. Just use the icon key — color and name are automatic.

badges: ["verified", "premium"],

5. Add links

Each link gets an icon image and a shadow color.

links: [
  { url: "https://github.com/YourName", icon: "src/assets/icons/icon.png", color: "#ffffff" },
],

6. Choose a layout and theme

layout: { type: "glass", containerWidth: "44rem" },
theme: { preset: "dark" },

7. Open in browser

Open index.html in your browser (double-click or drag into a browser window).

If you're already editing, just hit Ctrl+R / Cmd+R to see changes.

Pro tip: Use a live-reload server like bunx serve or VS Code's Live Server extension for instant refresh on save.

Minimal working config

This is the smallest config that produces a working profile page.

const CONFIG = {
  username: "YourName",
  uid: "12,345",
  splash: { text: "hello", fontSize: "34px" },
  avatar: { type: "icon" },
  bio: { typewriter: false, staticBio: "Just vibing." },
  joinedDate: "Joined 3 months ago",
  badges: [],
  links: [],
  views: 0,
  layout: { type: "default", containerWidth: "44rem" },
  theme: { preset: "dark" },
  background: { color: "#000000", effects: {} },
};
Getting Started

Project Structure

How the project is organized and how it works.

guns.lol/
├── index.html              # Entry point — open this in your browser
├── src/
│   ├── js/
│   │   ├── config.js   # ★ Your configuration file
│   │   └── main.js     # Application logic and rendering
│   ├── css/
│   │   └── style.css   # Profile page styles
│   └── assets/     # Images, icons, cursors, fonts
│       ├── avatar/
│       ├── cursor/
│       └── icons/
└── docs/                    # Documentation site (you are here)

How it works

  1. index.html loads config.js first, which defines the CONFIG object globally
  2. main.js reads CONFIG, generates CSS custom properties, builds the HTML structure, and initializes effects
  3. All rendering is purely client-side — no server, no API, no database
  4. Edit config.js, refresh the browser, see changes instantly

Important: config.js must load before main.js in the HTML. The default file already handles this correctly.

Reference

Configuration Overview

Every top-level property in the CONFIG object at a glance.

The entire profile is controlled by a single CONFIG object in src/js/config.js. Every feature is optional — leave fields at their default, set values to false, or use empty arrays to disable anything.

Here is the actual config.js with all default values — use it as your starting template:

const CONFIG = {
  username: "Sixfy",
  uid: "20,028",
  splash: { text: "guns.lol", fontSize: "34px", fontFamily: "", fontWeight: "500", color: "" },
  avatar: { type: "icon" },
  bio: { typewriter: true, texts: ["love", "sex", "hate", "disgust"], staticBio: "disgust", typeSpeed: 80, deleteSpeed: 50, pauseDuration: 2000 },
  joinedDate: "Joined over 2 years ago",
  badges: ["premium"],
  links: [{ url: "https://example.com", icon: "src/assets/icons/icon.png", color: "#ffffff" }],
  views: 644,
  audio: { src: "", title: "Another One", artist: "DJ Khaled", autoplay: true, loop: true, volume: 0.3, showControls: false, playlist: [] },
  volumeControl: { enabled: false, position: "top-left" },
  progressBar: { height: 3, radius: 15, color: "#ffffff", bgColor: "rgba(255,255,255,0.3)", thumbSize: 10, gradient: [] },
  cursor: { enabled: true, src: "src/assets/cursor/cursor.png", hotspotX: 16, hotspotY: 16 },
  mouseEffect: { enabled: true, variant: "particles", color: "#ffffff" },
  card3d: { enabled: true, intensity: 8, perspective: 1000 },
  fonts: { enabled: true, families: ["Array", "Onest"], importUrl: "" },
  shuffleText: { enabled: false, text: "SIXFY", fontFamily: "Press Start 2P", fontSize: "4rem" },
  layout: { type: "glass", containerWidth: "44rem", containerPadding: "26px", containerRadius: "20px" },
  location: { enabled: false, text: "guns.lol HQ", timezone: "Europe/Berlin" },
  about: { enabled: false, text: "Hi. I own guns.lol." },
  portfolio: { enabled: false, skills: ["Python", "JavaScript"], projects: [{ name: "guns.lol", description: "Create feature-rich, customizable and modern link-in-bio pages.", url: "https://guns.lol" }] },
  theme: { preset: "", textColor: "#ffffff", backgroundColor: "#000000", glowColor: "#ffffff", usernameEffects: "", containerColor: "rgba(255,255,255,0)", containerBlur: "0px", containerBorderWidth: "2px", containerBorderColor: "rgba(200,130,255,0.5)", selectionBg: "#ffffff", selectionColor: "#000000", buttonBg: "rgba(255,255,255,0.22)", buttonBgHover: "rgba(255,255,255,0.32)", buttonBorder: "2px solid rgba(255,255,255,0.12)", buttonRadius: "12px", volumeBg: "rgba(255,255,255,0.2)", volumeBorder: "2px solid rgba(255,255,255,0.05)" },
  background: { src: "", color: "#000000", effects: { aurora: true, dither: false, plasma: false, snow: false, rain: false, stars: true, fireflies: false } },
};

Top-level properties

PropertyTypeDefaultDescription
usernamestring"Sixfy"Display name at the top
uidstring"20,028"User ID in hover tooltip
splashobjectOverlay text and styling
avatarobjectIcon or image avatar
bioobjectStatic or typewriter bio
joinedDatestring"Joined over 2 years ago"Join date text
badgesarray[]Badge icon definitions
linksarray[]Social/URL link buttons
viewsnumber644Initial view count display
audioobjectAudio player settings
volumeControlobjectFloating volume slider
progressBarobjectAudio seek bar style
cursorobjectCustom cursor image
mouseEffectobjectMouse trail / particles / glow / ripple
card3dobject3D perspective tilt on hover
fontsobjectCustom font families
shuffleTextobjectMatrix-style text scramble
layoutobjectLayout preset and dimensions
locationobjectLocation pin with live clock
aboutobjectPersonal text section
portfolioobjectSkills and projects showcase
themeobjectColors, fonts, button styles
backgroundobjectColor, image, canvas effects
Configuration

Profile

Your display name, avatar, splash overlay, and join date.

These fields control the identity section at the top of your profile — the username, avatar, splash text overlay, and join date stamp.

Fields

FieldTypeDefaultDescription
usernamestring"Sixfy"Display name shown at the top of the profile
uidstring"20,028"User ID displayed in hover tooltip
joinedDatestring"Joined over 2 years ago"Join date stamp shown below badges. Set to empty string to hide.
splashobjectText overlay displayed across the profile
avatarobjectAvatar type and source

Splash

FieldTypeDefaultDescription
textstring""Overlay text. Empty string hides it.
fontSizestring"34px"CSS font size value
fontFamilystring""CSS font family. Empty = inherits profile font.
fontWeightstring"500"CSS font weight
colorstring""Text color. Empty = inherits theme text color.
splash: {
  text: "guns.lol",
  fontSize: "34px",
  fontFamily: "",
  fontWeight: "500",
  color: "",
},

Avatar

FieldTypeDefaultDescription
typestring"icon""icon" uses a generated icon. "image" uses a custom image.
srcstring""Required when type: "image". Path to the avatar image.
// Icon mode (default)
avatar: { type: "icon" },

// Custom image mode
avatar: { type: "image", src: "src/assets/avatar/example.png" },

Joined Date

A simple text string. Set to empty to hide the element entirely.

joinedDate: "Joined over 2 years ago",
Configuration

Badges

12 built-in badge icons with tooltips and custom colors.

Badges appear in a row beneath your avatar. Each badge shows an icon with a color tint and displays the badge name in a tooltip on hover.

Badge fields

FieldTypeDefaultDescription
namestringautoDisplayed on hover. Auto-derived from icon key if omitted.
iconstringKey from the BADGE_SVGS map (see below)
colorstringautoAuto-pulled from BADGE_DEFAULT_COLORS by name. Override with any CSS color.
monochromebooleanfalseIf true, forces white icon with white glow regardless of color

You can use just the icon key as a string — name and color are filled automatically:

badges: ["verified", "premium", "booster"],

Or use the full object format for custom names/colors:

badges: [
  { name: "Custom Badge", icon: "star", color: "#ff4500" },
],

Available icons

premium
staff
bug
legend
shield
star
heart
crown
verified
gift
trophy
booster

The icon keys map to inline SVG paths in BADGE_SVGS defined in config.js. You can add custom icons by extending the map.

Configuration

Bio & Typewriter

A static bio line or an animated typewriter that cycles through multiple texts.

The bio sits below your badges. Choose between a static text line or an animated typewriter that types, pauses, deletes, and repeats through a list of phrases.

Fields

FieldTypeDefaultDescription
typewriterbooleantrueEnable animated typewriter. false = static mode.
textsstring[]["love","sex","hate","disgust"]Phrases to cycle through (typewriter mode only)
staticBiostring"disgust"Static text shown when typewriter: false
typeSpeednumber80Milliseconds per character when typing
deleteSpeednumber50Milliseconds per character when deleting
pauseDurationnumber2000Milliseconds to pause after typing a phrase
bio: {
  typewriter: true,
  texts: ["love", "sex", "hate", "disgust"],
  staticBio: "disgust",
  typeSpeed: 80,
  deleteSpeed: 50,
  pauseDuration: 2000,
},

How it works

  1. First phrase types out, one character at a time (typeSpeed delay per char)
  2. Pauses for pauseDuration ms
  3. Deletes each character (deleteSpeed delay per char)
  4. Moves to the next phrase and repeats
  5. After the last phrase, loops back to the first

Static mode

Set typewriter: false. The staticBio value renders as plain text with no animation.

bio: {
  typewriter: false,
  staticBio: "Just vibing.",
},
Configuration

Audio Player

Inline music player with playlist, volume control, and progress bar.

The audio player sits inside the profile container. It supports a single track or a playlist, autoplay, looping, a draggable progress bar, and an optional volume slider.

Audio fields

FieldTypeDefaultDescription
srcstring""URL to the audio file (MP3, OGG, WAV)
titlestring"Another One"Track title shown in the player
artiststring"DJ Khaled"Artist name shown below the title
autoplaybooleantrueStart playing automatically when the page loads
loopbooleantrueRepeat the track/playlist when it ends
volumenumber0.3Initial volume (0.0 to 1.0)
showControlsbooleanfalseShow native browser audio controls
playlistarray[]Additional tracks to queue (see playlist format below)
audio: {
  src: "https://example.com/track.mp3",
  title: "My Track",
  artist: "Artist Name",
  autoplay: true,
  loop: true,
  volume: 0.3,
  showControls: false,
  playlist: [],
},

Playlist

Each playlist entry has the same shape as the main track. Tracks play in order and loop when the playlist ends.

FieldTypeDescription
srcstringURL to the audio file
titlestringTrack title
artiststringArtist name
playlist: [
  { src: "track1.mp3", title: "Song 1", artist: "Artist 1" },
  { src: "track2.mp3", title: "Song 2", artist: "Artist 2" },
],

Volume Control

A floating volume knob positioned relative to the profile container.

FieldTypeDefaultDescription
enabledbooleanfalseShow the volume slider
positionstring"top-left"Corner: "top-left", "top-right", "bottom-left", "bottom-right"
volumeControl: {
  enabled: true,
  position: "top-left",
},

Progress Bar

Customizable audio seek bar below the track info.

FieldTypeDefaultDescription
heightnumber3Bar height in pixels
radiusnumber15Border radius in pixels
colorstring"#ffffff"Progress fill color
bgColorstring"rgba(255,255,255,0.3)"Track background color
thumbSizenumber10Draggable thumb diameter in pixels
gradientarray[]Gradient color stops. Overrides color if set. Format: ["#ff0000", "#00ff00"]
progressBar: {
  height: 3,
  radius: 15,
  color: "#ffffff",
  bgColor: "rgba(255,255,255,0.3)",
  thumbSize: 10,
  gradient: [],
},
Configuration

Layouts

5 layout presets that control the overall structure and visual style.

The layout determines how your profile content is arranged — avatar position, container styling, spacing, and borders. Switch between presets with a single string.

Fields

FieldTypeDefaultDescription
typestring"glass"Layout preset key (see presets below)
containerWidthstring"44rem"Max width of the profile container
containerPaddingstring"26px"Inner padding of the profile container
containerRadiusstring"20px"Border radius of the profile container
layout: {
  type: "glass",
  containerWidth: "44rem",
  containerPadding: "26px",
  containerRadius: "20px",
},

Layout presets

PresetAvatarStyle
defaultLeftStandard bordered container with visible background
stackedTop, centeredSame as default but avatar and content stack vertically
compactLeftSmaller spacing and typography for a tighter feel
minimalLeftTransparent container, no border, content floats on background
glassLeftGlassmorphism — translucent container with backdrop blur
Configuration

Theme

Colors, fonts, container styling, and button appearance.

The theme controls every visual color on the page — text, background, container, buttons, selection highlight, and glow effects. You can use a preset or set every value manually.

Theme fields

FieldTypeDefaultDescription
presetstring""Preset name: "dark", "light", "neon", "ocean", or empty for manual
textColorstring"#ffffff"Primary text color
backgroundColorstring"#000000"Page background color
glowColorstring"#ffffff"Color used for glow/shadow effects
usernameEffectsstring""URL to a GIF applied as a mask/background on the username text
containerColorstring"rgba(255,255,255,0)"Profile container background
containerBlurstring"0px"Backdrop blur on the container (glass effect)
containerBorderWidthstring"2px"Container border width
containerBorderColorstring"rgba(200,130,255,0.5)"Container border color
selectionBgstring"#ffffff"Text selection background color
selectionColorstring"#000000"Text selection text color
buttonBgstring"rgba(255,255,255,0.22)"Link button background
buttonBgHoverstring"rgba(255,255,255,0.32)"Link button background on hover
buttonBorderstring"2px solid rgba(255,255,255,0.12)"Link button border
buttonRadiusstring"12px"Link button border radius
volumeBgstring"rgba(255,255,255,0.2)"Volume slider background
volumeBorderstring"2px solid rgba(255,255,255,0.05)"Volume slider border
theme: {
  preset: "",
  textColor: "#ffffff",
  backgroundColor: "#000000",
  glowColor: "#ffffff",
  usernameEffects: "",
  containerColor: "rgba(255, 255, 255, 0)",
  containerBlur: "0px",
  containerBorderWidth: "2px",
  containerBorderColor: "rgba(200, 130, 255, 0.5)",
  selectionBg: "#ffffff",
  selectionColor: "#000000",
  buttonBg: "rgba(255, 255, 255, 0.22)",
  buttonBgHover: "rgba(255, 255, 255, 0.32)",
  buttonBorder: "2px solid rgba(255, 255, 255, 0.12)",
  buttonRadius: "12px",
  volumeBg: "rgba(255, 255, 255, 0.2)",
  volumeBorder: "2px solid rgba(255, 255, 255, 0.05)",
},

Theme presets

Set preset to one of these to auto-fill all theme values. Leave empty to define everything manually.

PresetVibe
"dark"Black background, white text, purple container border
"light"White background, dark text, light borders
"neon"Dark background with bright cyan/magenta accents
"ocean"Dark blue background with teal and cyan tones

Fonts

Custom font families loaded via @import or Google Fonts.

FieldTypeDefaultDescription
enabledbooleantrueEnable custom fonts
familiesstring[]["Array","Onest"]Font family names in priority order
importUrlstring""Optional @import URL for the font (Google Fonts, etc.)
fonts: {
  enabled: true,
  families: ["Array", "Onest"],
  importUrl: "",
},
Configuration

Background

Color, image, and animated canvas effects that run behind your profile.

The background fills the full viewport behind the profile container. You can set a solid color, an image via URL, and layer up to 7 canvas-based effects on top.

Fields

FieldTypeDefaultDescription
srcstring""Background image URL. Empty = no image.
colorstring"#000000"Solid background color (visible behind effects)
effectsobjectToggle canvas effects on/off
background: {
  src: "",
  color: "#000000",
  effects: { aurora: true, dither: false, plasma: false, snow: false, rain: false, stars: true, fireflies: false },
},

Available effects

EffectDescriptionPerformance
auroraSlowly shifting aurora borealis with multiple colored bandsMedium
starsScrolling star field with parallax depth layersLight
snowFalling snowflakes with varying size and speedLight
rainRain streaks falling diagonallyLight
plasmaAnimated plasma color swirlsHeavy
firefliesSmall glowing particles floating with organic motionMedium
ditherDithering noise overlay for a retro/vaporwave lookLight

Multiple effects can impact performance, especially on low-end devices. The page auto-detects hardware capability and scales down effects when needed. Disable effects you don't need to keep things smooth.

Effects

Mouse Effects

4 visual feedback effects that respond to cursor movement and clicks.

A canvas-based effect that follows or reacts to your mouse. Choose from trail, particles, glow, or ripple variants. Only one variant can be active at a time.

Fields

FieldTypeDefaultDescription
enabledbooleantrueEnable the mouse effect
variantstring"particles"Effect type: "trail", "particles", "glow", or "ripple"
colorstring"#ffffff"Color of the effect elements
mouseEffect: {
  enabled: true,
  variant: "particles",
  color: "#ffffff",
},

Variants

VariantBehavior
trailFading circles follow behind the cursor like a comet tail
particlesVelocity-based particle bursts — faster movement emits more particles in 360° spread
glowSoft radial gradient glow that follows the cursor
rippleExpanding ring ripples emit on click

Performance: particles is the heaviest variant. The page auto-limits particle count on low-end devices. Switch to trail or glow for better performance.

Effects

3D Card Tilt

Interactive perspective tilt that follows mouse position over the profile card.

The profile container rotates in 3D space based on the mouse position relative to its center. Creates a physical, dimensional feel — like holding a card and tilting it toward the light.

Fields

FieldTypeDefaultDescription
enabledbooleantrueEnable 3D tilt
intensitynumber8Maximum tilt angle in degrees. Higher = more dramatic rotation.
perspectivenumber1000CSS perspective value in pixels. Lower = stronger depth distortion.
card3d: {
  enabled: true,
  intensity: 8,
  perspective: 1000,
},

Try intensity: 15 with perspective: 600 for a more exaggerated tilt. Lower intensity to 3 for a subtle, premium feel.

Effects

Custom Cursor

Replace the system cursor with a custom image.

Hides the browser's default cursor and uses a PNG image instead. Applies to the entire page.

Fields

FieldTypeDefaultDescription
enabledbooleantrueEnable custom cursor
srcstring""Path to a PNG cursor image
hotspotXnumber16X coordinate of the click hotspot (pixels from left)
hotspotYnumber16Y coordinate of the click hotspot (pixels from top)
cursor: {
  enabled: true,
  src: "src/assets/cursor/cursor.png",
  hotspotX: 16,
  hotspotY: 16,
},

For a centered cursor (like crosshair), set hotspot to half the image dimensions. For a pointer tip cursor, set hotspot near the top-left (e.g., hotspotX: 2, hotspotY: 2).

Effects

Shuffle Text

Matrix-style character scramble animation on the username.

The username text cycles through random letters before settling on the final value. Creates a hacker/matrix aesthetic. Works best with a monospace or pixel font.

Fields

FieldTypeDefaultDescription
enabledbooleanfalseEnable shuffle animation on page load
textstring"SIXFY"The text to animate (overrides username for this effect)
fontFamilystring"Press Start 2P"Font used during the shuffle animation
fontSizestring"4rem"Font size during the animation
shuffleText: {
  enabled: true,
  text: "SIXFY",
  fontFamily: "Press Start 2P",
  fontSize: "4rem",
},

The shuffle effect only runs once on page load. After settling, the username displays normally using the profile's configured font.

Effects

Particle System

Velocity-based particle engine used by the mouse particles variant.

The particle system powers the particles variant of Mouse Effects. It's a real-time particle engine with gravity, friction, and velocity response — faster mouse movement produces more particles.

Behavior

  • Velocity response: Moving the mouse faster emits more particles. Slow movement produces fewer, larger particles.
  • 360° spread: Particles emit in all directions from the cursor position.
  • Gravity & friction: Particles arc downward with simulated gravity and gradually slow down before fading out.
  • Auto-scaling: Low-end devices get fewer max particles to maintain frame rate.
  • Customizable color: Set via mouseEffect.color in the config.
mouseEffect: {
  enabled: true,
  variant: "particles",
  color: "#a749dd",
},

Configure the particle system via the Mouse Effects section. The particle variant is selected by variant: "particles".

Extra Sections

Location

A location pin with live timezone clock.

Shows a pin icon with a location label and a live digital clock that updates every second based on the configured timezone.

Fields

FieldTypeDefaultDescription
enabledbooleanfalseShow the location section
textstring"guns.lol HQ"Location label text (e.g., city name or "Remote")
timezonestring"Europe/Berlin"IANA timezone identifier for the live clock
location: {
  enabled: true,
  text: "guns.lol HQ",
  timezone: "Europe/Berlin",
},

Timezone uses IANA format (e.g. "America/New_York", "Asia/Tokyo"). The clock updates every second using the browser's Intl.DateTimeFormat.

Extra Sections

About

A short text section for a personal message or tagline.

Displays a block of text beneath your profile. Great for a short bio, tagline, or description.

Fields

FieldTypeDefaultDescription
enabledbooleanfalseShow the about section
textstring"Hi. I own guns.lol."About text content
about: { enabled: true, text: "Hi. I own guns.lol." },
Extra Sections

Portfolio

A skills and projects showcase section.

Displays your skills as tags and your projects as clickable cards. Each project links to its URL in a new tab.

Portfolio fields

FieldTypeDefaultDescription
enabledbooleanfalseShow the portfolio section
skillsstring[]["Python","JavaScript"]List of skill names displayed as tags
projectsarrayList of project entries (see below)

Project entry

FieldTypeDescription
namestringProject display name
descriptionstringShort project description
urlstringProject link (opens in new tab)
portfolio: {
  enabled: true,
  skills: ["Python", "JavaScript", "TypeScript"],
  projects: [
    {
      name: "guns.lol",
      description: "Create feature-rich, customizable link-in-bio pages.",
      url: "https://guns.lol",
    },
  ],
},
Reference

Troubleshooting

Common issues and how to fix them.

Blank page / nothing shows

  • Make sure src/js/config.js loads before main.js in the HTML
  • Check the browser console (F12) for JavaScript errors
  • Verify CONFIG is defined and valid — missing commas or brackets will break the script

The HTML already has the correct script order. If you restructured the files, make sure config.js loads before main.js.

Effects not working

  • Effects require enabled: true in their config object
  • Background canvas effects stop if hardware acceleration is disabled in browser settings

Images not loading

  • Use relative paths from index.html, not from the config file location
  • Check that file paths exist and extensions match (case-sensitive on some servers)
  • Link icon images should be ~64x64px for best appearance

Audio not playing

  • Browsers block autoplay until the user interacts with the page. Click anywhere first.
  • Use a direct MP3 URL (not a streaming page or playlist link)
  • Check that the audio file supports CORS if hosted on a different domain

Performance issues

  • Disable background effects you don't need — plasma is the heaviest
  • Use trail or glow mouse effects instead of particles on low-end devices
  • The page auto-detects low-end hardware and scales effects, but manual tuning helps

Config not applying

  • Refresh the page (hard refresh: Ctrl+Shift+R / Cmd+Shift+R)
  • Check for JSON syntax errors in the config file
  • Some config changes (layout, theme) restructure the DOM — a full refresh may be needed

Layout looks wrong / card broken

  • The card3d effect can clash with custom layouts — try setting card3d.enabled: false if the card container looks shifted or clipped
  • Make sure containerWidth isn't too narrow for your content (minimum ~32rem on desktop)
  • The glass layout requires containerBlur to be set (default 0px disables the glass effect entirely)
  • If the card overflows on mobile, set containerPadding lower (e.g., 16px)

Fonts not showing

  • Custom fonts require an active internet connection for the first load (they're loaded live from Google Fonts or external URLs)
  • If using importUrl, make sure it's a valid CSS @import URL (e.g., https://fonts.googleapis.com/css2?family=...)
  • Font names in families must match exactly what the imported stylesheet declares — check for typos or missing spaces
  • Set fonts.enabled: false if you want to fall back to the system font stack

Shuffle text not animating

  • shuffleText.enabled must be true (it's false by default)
  • The animation runs once on page load and then settles — you won't see it again until you hard refresh
  • It requires a font that supports the characters you're using; try Press Start 2P or another monospace/pixel font
  • The effect overrides the username during the animation — if username is too long, the shuffle may look cut off with the default font size

Custom cursor not showing

  • Verify cursor.enabled: true and a valid src path to a PNG file
  • The path is relative to index.html, not to config.js
  • Some browsers disable custom cursors in certain UI elements (form inputs, iframes) — this is normal
  • PNG with transparency works best; avoid JPEG or BMP
  • If the cursor appears tiny or giant, adjust hotspotX and hotspotY to match the image dimensions

3D card tilt not working

  • Make sure card3d.enabled: true
  • The tilt only activates on devices with a mouse — touch devices don't trigger hover, so the effect stays flat
  • If the card jumps or glitches on hover, lower intensity (try 4) or raise perspective (try 1500)
  • Some layouts (minimal) may need card3d disabled to keep the transparent container stable

Splash text not appearing

  • Set splash.text to a non-empty string — empty string hides the splash entirely
  • The splash renders above the profile card; if fontSize is too large, it may overflow or be clipped by the viewport
  • If splash.color is empty, it inherits theme.textColor — if both end up matching the background, it's invisible

Links not opening

  • Each link needs a valid url including the protocol (https://). Relative paths like /page won't work unless hosted on a server
  • The icon color field only affects the drop-shadow filter — it won't break the link if missing
  • Check the browser console for errors — the link opens in a new tab via window.open

Badge not showing correct color / tooltip

  • String shorthand badges (e.g., "premium") auto-resolve name, color, and SVG from built-in maps — if the key doesn't exist in BADGE_SVGS, nothing renders
  • For custom badges, use the full object format with name, icon, color
  • Tooltips are driven by the name field — if it's missing, the tooltip is empty
  • Badge SVGs are inlined in config.js — you can add new icons by extending the BADGE_SVGS map

Volume control not visible

  • volumeControl.enabled must be true
  • The volume slider is positioned outside the profile container at one of four corners — make sure there's enough viewport space around the card
  • The position value is relative to the profile container, not the page. If the container is near the viewport edge, the slider may be partially off-screen

Container not centered / wrong width

  • containerWidth sets the max-width — on very wide screens the container stays centered via margin: 0 auto
  • If the container sticks to the left, check that index.html hasn't had its centering CSS removed
  • On mobile, the container fills the full width regardless of containerWidth — this is intentional for small screens
  • Set containerWidth in rem or px — percentage values like 90% are not tested and may behave unpredictably

Background image not showing with effects

  • The background.src image sits behind the canvas effects — if effects are opaque (e.g., aurora fills the whole canvas), you won't see the image
  • Disable opaque effects or set color to match the dominant color of your image so the transition between image and effects is seamless
  • The image is set as background-image on the page body — use a URL that supports CORS if externally hosted

Avatar not showing

  • If avatar.type is "image", avatar.src must point to a valid image file — otherwise nothing renders (no fallback icon)
  • The path is relative to index.html, not to config.js
  • Use avatar.type: "icon" to fall back to a generated avatar icon based on the username's first letter
  • Square images work best — the avatar is displayed in a fixed-size circle with object-fit: cover

Typewriter bio stuck / not cycling

  • bio.typewriter must be true — if it's false, it shows static text only
  • bio.texts needs at least 2 entries for the cycling to be noticeable (with 1 entry it types once and pauses forever)
  • Check typeSpeed and deleteSpeed — extremely high values (e.g., 5000) make the animation appear frozen
  • The cursor blinking is part of the typewriter element — if the cursor is missing but text appears, verify the CSS .typing-cursor class isn't overridden

Complete Config Example

const CONFIG = {
  username: "Sixfy",
  uid: "20,028",
  splash: { text: "guns.lol", fontSize: "34px", fontFamily: "", fontWeight: "500", color: "" },
  avatar: { type: "icon" },
  bio: {
    typewriter: true,
    texts: ["love", "sex", "hate", "disgust"],
    staticBio: "disgust",
    typeSpeed: 80,
    deleteSpeed: 50,
    pauseDuration: 2000,
  },
  joinedDate: "Joined over 2 years ago",
  badges: ["premium", "staff", "bug", "verified"],
  links: [
    { url: "https://example.com", icon: "src/assets/icons/icon.png", color: "#ffffff" },
  ],
  views: 644,
  audio: {
    src: "https://example.com/track.mp3",
    title: "Another One",
    artist: "DJ Khaled",
    autoplay: true,
    loop: true,
    volume: 0.3,
    showControls: false,
    playlist: [],
  },
  volumeControl: { enabled: false, position: "top-left" },
  progressBar: {
    height: 3, radius: 15, color: "#ffffff",
    bgColor: "rgba(255,255,255,0.3)", thumbSize: 10, gradient: [],
  },
  cursor: {
    enabled: true,
    src: "src/assets/cursor/cursor.png",
    hotspotX: 16, hotspotY: 16,
  },
  mouseEffect: { enabled: true, variant: "particles", color: "#ffffff" },
  card3d: { enabled: true, intensity: 8, perspective: 1000 },
  fonts: { enabled: true, families: ["Array", "Onest"], importUrl: "" },
  shuffleText: { enabled: false, text: "SIXFY", fontFamily: "Press Start 2P", fontSize: "4rem" },
  layout: { type: "glass", containerWidth: "44rem", containerPadding: "26px", containerRadius: "20px" },
  location: { enabled: false, text: "guns.lol HQ", timezone: "Europe/Berlin" },
  about: { enabled: false, text: "Hi. I own guns.lol." },
  portfolio: {
    enabled: false,
    skills: ["Python", "JavaScript"],
    projects: [{ name: "guns.lol", description: "Create feature-rich, customizable and modern link-in-bio pages.", url: "https://guns.lol" }],
  },
  theme: {
    preset: "",
    textColor: "#ffffff",
    backgroundColor: "#000000",
    glowColor: "#ffffff",
    usernameEffects: "",
    containerColor: "rgba(255, 255, 255, 0)",
    containerBlur: "0px",
    containerBorderWidth: "2px",
    containerBorderColor: "rgba(200, 130, 255, 0.5)",
    selectionBg: "#ffffff",
    selectionColor: "#000000",
    buttonBg: "rgba(255, 255, 255, 0.22)",
    buttonBgHover: "rgba(255, 255, 255, 0.32)",
    buttonBorder: "2px solid rgba(255, 255, 255, 0.12)",
    buttonRadius: "12px",
    volumeBg: "rgba(255, 255, 255, 0.2)",
    volumeBorder: "2px solid rgba(255, 255, 255, 0.05)",
  },
  background: { src: "", color: "#000000", effects: { aurora: true, dither: false, plasma: false, snow: false, rain: false, stars: true, fireflies: false } },
};
Updates

Changelog

Version history of the guns.lol profile clone.

v1.0.1 Latest 2026-07-04
Performance
  • Single rAF orchestrator: Merged 8 independent requestAnimationFrame loops (aurora, dither, plasma, snow, rain, stars, fireflies, equalizer, avatar wave, mouse effects) into a single _registerAnimation/_unregisterAnimation orchestrator with weight-based skip framing.
  • Reduced canvas resolution: Desktop canvas scale lowered from 0.750.55; added pixelScale = 0.35 for per-pixel effects (aurora, dither, plasma).
  • Stars glow pre-render: Offscreen glow rendered once instead of per-frame radial gradients.
  • Tooltip early return: Skip rAF when no .tip-trigger is hovered.
  • Consolidated badge <style> tags: Injected once instead of per-badge.
Clean Code
  • Renamed cryptic variables:
    • _hidisPageHidden
    • _lowEndisLowEndDevice
    • _mobileisMobile
    • _perfScaleperformanceScale
    • _canvasScalecanvasScale
    • _rsTimer / _resizeCbsresizeTimer / resizeCallbacks
    • _onResizeonResize
    • ttheme
  • Removed unused _rSize utility function.
Config
  • Reformatted config.js to multi-line sections with consistent indentation.
Fixes
  • 3D card tilt: Restored to target .card directly (removed .card-inner wrapper that broke the original structure).
  • _registerAnimation bug: Function definitions were missing the underscore prefix, causing ReferenceError and blank page. Renamed registerAnimation_registerAnimation, unregisterAnimation_unregisterAnimation.
  • theme renames: Fixed side-effect corruptions where words ending in t (e.g., rect, parent, playlist, layout, document, about, gradient, classList, target, shuffleText, mouseEffect) were incorrectly transformed to rectheme, parentheme, etc.
CSS
  • Restored original entrance animation on .card:
    • .card-init: transition: opacity 1s, margin-bottom .6s with margin-bottom: -100px
    • .card-show: opacity: 1 !important with margin-bottom: 0
  • Removed .card-inner CSS rules (no longer needed).
Housekeeping
  • Deleted .config.js.bak (leftover backup file).
v1.0.0 2026-07-03
Release
  • Initial release & docs site launch.