Skip to content


There are three major ways to configure Crazy Arms,

  1. Station Settings in the station admin site
  2. The startup environment file (.env)
  3. The Harbor source code, using Liquidsoap

Station Settings (Dynamic Settings)

In the station admin site, the following configuration options are available, and are dynamically configured, which is to say they can be changed at any time without having to restart (and rebuild) the Crazy Arms server. Anyone with administrator privileges can edit these in the web app.

Some Settings May Not Be Available

If Zoom or local Icecast server is disabled in the .env file, those sections will not be available. See more information on the .env file below.

Below are a list of configuration options, organized by section.

General Options

STATION_NAMEType: String (required, 40 characters max)

The name of your radio station.

Default: 'Crazy Arms Radio Station'

PLAYOUT_LOG_PURGE_DAYSType: Integer (non-negative)

The number of days to keep playout log entries after which they’re purged. Set to 0 to keep playout log entries forever.

Default: 14


Append the string “LIVE on ” to the stream’s metadata for live broadcasts.

Default: True

AutoDJ Configuration

AUTODJ_ENABLEDType: Boolean (true or false)

Whether or not to run an AutoDJ on the harbor.

Default: True

AUTODJ_REQUESTSType: Choice of: Disabled (nobody), Users, Users with “Program the AutoDJ” permissions, Superusers

AutoDJ requests enabled for the following users.

Default: 'disabled'

AUTODJ_REQUESTS_NUMType: Integer (non-zero)

The maximum number of pending AutoDJ requests (if enabled)

Default: 5

AUTODJ_ANTI_REPEAT_ENABLEDType: Boolean (true or false)

Whether or not the AutoDJ should attempt its anti-repeat algorithm. Note if you have too few tracks, this won’t work.

Default: True


Number of tracks to avoid to avoid repeating (if possible). Set to 0 to disable.

Default: 50


Number of tracks to avoid playing the same artist (if possible). Set to 0 to disable.

Default: 15

AUTODJ_PLAYLISTS_ENABLEDType: Boolean (true or false)

Whether or not the AutoDJ should use playlists

Default: True

AUTODJ_STOPSETS_ENABLEDType: Boolean (true or false)

Whether or not the AutoDJ plays stop sets (for ADs, PSAs, Station IDs, etc)

Default: False

AUTODJ_STOPSETS_ONCE_PER_MINUTESType: Integer (non-negative)

How often a stop set should approximately be played (in minutes)

Default: 20

Harbor Configuration


Enable compression and normalization on harbor stream.

Default: True

HARBOR_TRANSITION_WITH_SWOOSHType: Boolean (true or false)

Transition between harbor sources with a ~1 second swoosh effect.

Default: False


Audio file for the swoosh (if enabled). Sound be short, ie under 3-4 seconds.

Default: False

HARBOR_TRANSITION_SECONDSType: Decimal (non-negative)

Fadeout time in seconds when transitioning between harbor sources. Set to 0 for no fadeout.

Default: 2.5


The maximum number of seconds of silence on a live source (eg. Zoom or live DJs) until it will be considered inactive, ie until we would treat it as if it were offline.

Default: 15


Failsafe audio file that the harbor should play if there’s nothing else to stream.

Default: False


Failsafe audio file that should be broadcast to upstream servers if we can’t connect to the harbor, ie the harbor failed to start.

Default: False

Audio Assets Configuration

ASSET_ENCODINGType: Choice of: MP3, Ogg Vorbis, FLAC

Encoding of downloaded external assets and non-standard input files.

Default: 'mp3'

ASSET_BITRATEType: Choice of: 64kbit, 128kbit, 192kbit, 256kbit, 320kbit

Bitrate (quality) of downloaded external and non-standard audio files. (Unused for FLAC.)

Default: '128K'

ASSET_DEDUPINGType: Boolean (true or false)

Enable duplicate detection for audio assets based on metadata and audio fingerprint.

Default: True

Google Calendar Based Authentication

GOOGLE_CALENDAR_ENABLEDType: Boolean (true or false)

Enabled Google Calendar based authentication for DJs.

Default: False


Google Calendar ID.

Default: ''


Past the contents of your Google Service JSON Account Key here (a credentials.json file).For more info from Google about this please click here.

Default: ''

Zoom Settings

ZOOM_MAX_SHOW_LENTH_MINUTESType: Integer (number of minutes)

Maximum show length (in minutes) of an unscheduled Zoom broadcast.

Default: 300

ZOOM_DEFAULT_SHOW_LENTH_MINUTESType: Integer (number of minutes)

Default show length (in minutes) of an unscheduled Zoom broadcast. Note shows scheduled through Google Calendar will default to the length of the calendar event (or the maximum show length above, whichever is shorter).

Default: 120

Local Icecast Server Settings


Location setting for the Icecast server.

Default: 'The World'


The admin email setting for the Icecast server.

Default: ''

ICECAST_ADMIN_PASSWORDType: String (required)

Admin password for the Icecast server.

Default: 'default'

ICECAST_SOURCE_PASSWORDType: String (required)

Source password for the Icecast server.

Default: 'default'

ICECAST_RELAY_PASSWORDType: String (required)

Relay password for the Icecast server.

Default: 'default'

ICECAST_MAX_CLIENTSType: Integer (non-negative)

Max connected clients allowed the Iceacst server (0 for unlimited).

Default: 0

ICECAST_MAX_SOURCESType: Integer (non-negative)

Max sources allowed to connect to the Icecast server (0 for unlimited).

Default: 0

The Environment File – .env (Static Settings)

When Crazy Arms starts for the first time with ./, you’ll get asked a series of simple questions. In your root directory, all that’s happening is the file .default.env is being modified and copied to .env.

Advanced Users Only

Editing the .env file is meant to be done once at installation (or rarely), and is intended for systems administrators only, ie the nerds who set up Crazy Arms for your station. If your just a regular admin user, you’ll probably be more interested in the station settings above.

Which Services Start

If you edit ZOOM_ENABLED, ICECAST_ENABLED, EMAIL_ENABLED, HARBOR_TELNET_WEB_ENABLED, RTMP_ENABLED you actually are controlling which services (or Docker containers) Crazy Arms starts up. This is the reason why these settings are static, since the list of containers we choose to run is determined at start time.

Below is a copy of the .default.env file that shipped with Crazy Arms which does a decent enough job of explaining what each option does.

# .default.env -- The default configuration for Crazy Arms
# Notes:
#  * The ./ script will copy this and fill out some values for you
#    on first run.
#  * Boolean values must be 0 or 1
#  * SECRET_KEY _must_ be set (./ will set it for you)

# Whether to run in DEBUG mode (Do _NOT_ set this to 1 on production)

# Django secret key -- MUST be set, ./ will generate one for you
#  - Valid characters: Letter, numbers and any of: ! @ # % ^ & * ( - _ = + )

# Default timezone for server (note: users can set their own TZ in the web UI)

# Domain name used for the web app, ie if it's at,
# enter
# Note: This to match what users type into their web browser or the web app will
#       refuse connections.

# Allow DJs to broadcast via a Zoom room

# Whether or not to run a local Icecast server (kh fork)

# Use letsencrypt to enable HTTPS. The DNS record for DOMAIN_NAME must resolve
# to the IP address of your server.
# letencrypt requires an email address if you use it

# Enable email notifications
# If you've enabled emails, these must to be specified

# Harbor Telnet Access over Web (experimental, so disabled by default)

# RTMP streaming

# Custom port overrides, set these to whatever you like. SFTP could be set to 22
# if you aren't running ssh on your server.

Liquidsoap Source (Advanced)


  • Liquidsoap
  • It’s complicated but lots of fun to use.