Configuration file
The Settings pages write a YAML file, usually /etc/mutara/mutara.yaml. You can also edit it. This page lists every key.
The file #
- Mutara reads
-config, or./mutara.yaml, then/etc/mutara/mutara.yaml. mutara -example-configprints a commented example.mutara -check-configchecks the file and all module files.- An unknown key is an error.
- A save from Settings writes the file again and keeps the old file as
.bak. Comments in the file are lost.
Some settings apply at once, without a restart. A change to node.callsign restarts Mutara. Most other changes restart Mutara. With more than one module, a change to a module restarts only that module.
Types
- duration: a number and a unit, for example
400ms,2s,10mor24h. - secret: a value in one of three forms:
password: x,password: {env: NAME}orpassword: {file: /path}. The Settings page can set only a value. Only the config file can set{env: NAME}or{file: /path}; a save from Settings keeps them as they are. - mode:
transceive,monitororlocalmonitor.
node #
The station and the radio controller.
- node.callsignstring
The callsign of the station. The ID uses it. A change restarts Mutara.
Default: none. Example:
N0CALL.- node.namestring
The name of the node on the dashboard.
Default: empty. Example:
Example Hub.- node.duplexinteger 0, 1 or 2
The radio mode: 0 simplex quiet, 1 simplex node, 2 duplex repeater.
Default: 0; a new config has 1. Example:
1.- node.hang_timeduration
How long the transmitter stays on after the last talker.
Default:
2s. Example:2s.- node.keyup_delayduration
The silence before a tone, ID or announcement.
Default:
400ms. Example:400ms.- node.timeoutduration
The timeout timer. The node stops a talker after this time.
Default:
3m. Example:3m.- node.timeout_resetduration
How long a talker must stop before the timeout timer starts again. 0 means 2s.
Default: 0 (2s). Example:
2s.- node.announce_idleduration, 1s to 10s
The idle slot. The station ID and the announcements wait until nobody has talked for this time: no local receive, no link audio and no web or app talker. Then they play together. Only the timeout warning plays over a talker. 0 means 2s.
Default: 0 (2s). Example:
2s.- node.announce_wait, node.announce_skip
No longer used. The node reads a file that has them and removes them when it saves. An announcement does not expire: it waits for the next idle slot.
- node.hourly_timeboolean
Say the time at the top of each hour in the report hours.
Default: false; a new config has true. Example:
true.- node.report_hoursstring
The first and last hour (0 to 23) for timed reports. Empty means 7-22.
Default:
empty (7-22). Example:7-22.- node.id_intervalduration
How often the node identifies while it is in use. The ID is due 1 minute early (at most 10% early) and waits for the idle slot. If no slot comes before the full interval, the node sends a CW ID over the talker.
Default:
10m. Example:10m.- node.id_textstring
The text of the ID. Empty uses the callsign.
Default: empty. Example:
N0CALL/R.- node.id_modestring: cw, voice or both
How the node identifies.
Default:
cw. Example:both.- node.cw_wpminteger, 5 to 60
The CW speed in words per minute.
Default:
20. Example:20.- node.cw_freqnumber, 300 to 3000
The CW tone in Hz.
Default:
800. Example:800.- node.telemetry_dbnumber
The peak level of tones and IDs in dBFS.
Default:
-18. Example:-18.- node.telemetrystring: voice or cw
How the node gives link, status and time announcements.
Default:
voice. Example:voice.- node.voicestring
The built-in voice.
Default:
allison. Example:allison.- node.courtesy_toneboolean
Play the courtesy tone after network audio.
Default:
true. Example:true.- node.unlinked_toneboolean
With no links, beep two times after each local transmission.
Default:
true. Example:true.- node.ack_toneboolean
Beep after each local transmission.
Default: false; a new config has true. Example:
true.- node.ack_delayduration, 0 to 3s
The time from the end of a local transmission to the ack tone.
Default:
400ms. Example:400ms.- node.ack_hangduration, 0 to 5s
How long the transmitter stays on after the ack tone.
Default:
0. Example:500ms.- node.parrotboolean
Play each local transmission back to the radio.
Default:
false. Example:false.- node.announce_ipboolean
Say the IP addresses of the node after each start.
Default:
false. Example:true.- node.courtesy_soundstring
The tone after network audio: a preset key, a name from tones, or an app_rpt tone. Empty means the Mutara tone.
Default: empty. Example:
ct1.- node.ack_soundstring
The ack tone, in the same forms as courtesy_sound.
Default: empty. Example:
ct1.- node.tonesmap of name to tone
Your own tones in app_rpt form. A name has 1 to 40 characters.
Default: empty. Example:
{Club: "|t(350,0,100,2048)"}.
allstar #
Registration, links, users and commands.
- allstar.enabledboolean
Join the AllStarLink network.
Default:
false. Example:true.- allstar.nodestring
The node number.
Default: empty. Example:
"2100".- allstar.passwordsecret
The node password from the AllStarLink portal.
Default: empty. Example:
{env: MUTARA_NODE_PASSWORD}.- allstar.registerboolean
Register the node so other nodes can find it.
Default:
false. Example:true.- allstar.register_urlstring
The registration server.
Default:
https://register.allstarlink.org/. Example:https://register.allstarlink.org/.- allstar.register_intervalduration
How often the node registers. 0 means 3m.
Default: 0 (3m). Example:
3m.- allstar.listenstring
The address and UDP port for IAX2.
Default:
:4569. Example::4569.- allstar.public_portinteger
The UDP port that the node registers, if the router changes it. 0 means the listen port.
Default:
0. Example:4570.- allstar.verify_callersboolean
A calling node must use the address that its number resolves to.
Default:
true. Example:true.- allstar.allow_linksboolean
Accept incoming links.
Default:
true. Example:true.- allstar.accessstring: open, allow or deny
Which nodes can link in. If it is empty, Mutara uses the lists to select it.
Default:
open. Example:allow.- allstar.allowlist of strings
The nodes that can link in when access is allow.
Default: empty. Example:
["2200", "2201"].- allstar.denylist of strings
The nodes that cannot link in when access is deny.
Default: empty. Example:
["2350"].- allstar.permalinkslist of {node, mode}
Permanent links. They connect at start and when they drop.
Default: empty. Example:
[{node: "2200", mode: transceive}].- allstar.static_nodesmap of node to {address, no_ip_check}
Private nodes that are not in the AllStarLink DNS.
Default: empty. Example:
{"2201": {address: 192.168.1.60:4569}}.- allstar.dns_domainstring
The DNS domain for node lookup.
Default:
nodes.allstarlink.org. Example:nodes.allstarlink.org.- allstar.stats_urlstring
Where the node sends its statistics. off turns it off.
Default:
http://stats.allstarlink.org/uhandler. Example:off.- allstar.nodelist_urlstring
The node list for lookup. off turns it off.
Default:
https://snodes.allstarlink.org/diffnodes.php. Example:off.- allstar.functionsmap of digits to action
The DTMF commands, as app_rpt actions such as ilink,3 or cop,11.
Default: the stock app_rpt codes, plus *5 for macros and *76 for the weather. Example:
{"3": "ilink,3"}.- allstar.function_accessmap of digits to list
Who can run a command: radio, link and user. [] turns it off.
Default: all. Example:
{"1": [radio, user]}.- allstar.macrosmap of number to digits
Macros for *5.
Default: empty. Example:
{"1": "*32200"}.- allstar.schedulelist of {name, cron, run, off}
Commands that run at cron times, in local time.
Default: empty. Example:
[{name: Net, cron: "0 19 * * 2", run: "*32200"}].- allstar.startup_macrostring
Commands that run one time when Mutara starts.
Default: empty. Example:
"*8132200".- allstar.link_inactivityduration
Drop links that are quiet for this time. Permanent links stay. 0 is off.
Default:
0. Example:30m.- allstar.link_inactivity_runstring
Run these commands in place of the drop.
Default: empty. Example:
"*12200".- allstar.node_infoboolean
Look up the callsigns of linked nodes for the dashboard.
Default:
true. Example:true.- allstar.node_db.enabledboolean
Download the AllStarLink node list every 6 hours, for search by callsign.
Default:
false. Example:true.- allstar.node_db.urlstring
A different node list. Empty means the AllStarLink list.
Default: empty. Example: empty.
- allstar.say_callsignsboolean
Announcements spell the callsign of a node in place of its number. Needs node_db.
Default:
false. Example:true.- allstar.node_namesmap of node to name
Your names for nodes, 40 characters at most.
Default: empty. Example:
{"2200": Hilltop Net}.- allstar.favoriteslist of {node, mode}
Up to 50 favorites. The mode is transceive, monitor or localmonitor.
Default: empty. Example:
[{node: "2200", mode: monitor}].- allstar.userslist
IAX2 app logins. The keys are below.
Default: empty. Example: see below.
- allstar.users[].namestring
The user name. It is used one time only in the install.
Default: none. Example:
k1abc.- allstar.users[].secretsecret
The password of the user.
Default: none. Example:
{env: MUTARA_K1ABC_SECRET}.- allstar.users[].callsignstring
The callsign that the dashboard shows.
Default: empty. Example:
K1ABC.- allstar.users[].modestring
transceive, monitor or localmonitor.
Default:
transceive. Example:transceive.- allstar.users[].pttstring: dtmf, vox or voice
How the user keys: *99 and #, VOX, or any audio.
Default:
dtmf. Example:vox.- allstar.users[].no_rfboolean
Keep the audio of the user off the local radio.
Default:
false. Example:true.- allstar.users[].permitlist of addresses
The addresses that the user can call from. Empty allows all.
Default: empty. Example:
[100.64.0.0/10].- allstar.users[].commandsboolean
Let the user send DTMF commands.
Default:
false. Example:false.- allstar.users[].nodestring
The node that the call goes to when it dials no node of the install.
Default: the first node. Example:
"2101".- allstar.require_calltokenboolean
Accept only IAX2 callers that send a call token.
Default:
true. Example:true.
opusref #
On hold: this feature may change or be removed. The dashboard does not show it unless a node already uses it.
A list of OpusRef reflector bridges.
- opusref.namestring
The name of the bridge.
Default:
opusrefN. Example:club.- opusref.serverstring
The reflector, as host:port.
Default: none. Example:
ref.example.net:4570.- opusref.callsignstring
The callsign on the reflector.
Default:
node.callsign. Example:N0CALL.- opusref.channelstring
The channel ID.
Default: none. Example:
club.- opusref.access_tokensecret
A token for the channel.
Default: empty. Example:
{env: MUTARA_REF_TOKEN}.An authority URL, in place of a token.
Default: empty. Example:
https://auth.example.net.- opusref.service_idstring
The service ID for the authority.
Default: empty. Example:
mutara.- opusref.service_secretsecret
The service secret for the authority.
Default: empty. Example:
{file: /etc/mutara/ref.secret}.- opusref.modestring
transceive, monitor or localmonitor.
Default:
transceive. Example:monitor.- opusref.no_rfboolean
Keep the reflector audio off the local radio.
Default:
false. Example:true.
radio #
The USB radio interface. Only the first node can have a radio. All radio filters work at 48 kHz. Read Radio filters.
- radio.enabledboolean
Use a radio. Off makes the node an internet hub.
Default:
false. Example:true.- radio.devicestring
The interface: auto, a hidraw path or usb:vendor:product.
Default:
auto. Example:usb:0d8c:0012.- radio.carrier_fromstring: usbinvert, usb, vox or no
Carrier detect. dsp is a name for vox.
Default:
usbinvert. Example:usbinvert.- radio.ctcss_fromstring: no, usb or usbinvert
CTCSS detect.
Default:
no. Example:usb.- radio.invert_pttboolean
Invert the PTT output.
Default:
false. Example:false.- radio.rx_gain_dbnumber, -20 to 20
Digital receive gain in dB.
Default:
0. Example:3.- radio.tx_gain_dbnumber, -20 to 20
Digital transmit gain in dB.
Default:
0. Example:-2.- radio.deemphasisboolean
De-emphasis, for flat audio from the radio.
Default:
false. Example:true.- radio.preemphasisboolean
Pre-emphasis, for flat audio to the radio.
Default:
false. Example:true.- radio.pl_filterboolean
Remove the CTCSS tone from the audio.
Default:
false. Example:true.- radio.rx_lowpass_hzinteger: 3400, 5000 or 7000
The corner of the soft low-pass on receive audio, in Hz. It removes hiss above the voice band. Settings names the choices by band: 3400 is narrow, 5000 medium and 7000 wide. This is also the band tag of the radio's audio to browsers and apps: when only the radio talks, listeners get this band. A wider band carries more energy from the same signal, so you may need to lower
radio.rx_gain_dba little.Default:
5000. Example:3400.- radio.tx_lowpass_hzinteger: 3000 or 5000
The top of the transmit band, in Hz. Transmit audio is 300 Hz to this value. The node filters at this value before and after the transmit limiter. If the deviation or the occupied bandwidth is too high, set
3000.Default:
5000. Example:3000.- radio.rx_mixerinteger, 0 to 999
The receive level of the sound card.
Default:
500. Example:500.- radio.tx_mixerinteger, 0 to 999
The transmit level of the sound card.
Default:
500. Example:500.- radio.vox_level_dbnumber
The VOX level in dBFS.
Default:
-35. Example:-35.- radio.agcboolean
Level the received audio to about -25 dBFS.
Default:
false. Example:true.- radio.gatestring: both, rx, tx or off
The radio audio gate at start.
Default:
both. Example:both.- radio.module.enabledboolean
Use a radio module on a serial port.
Default:
false. Example:true.- radio.module.portstring
The serial port.
Default: empty. Example:
/dev/serial/by-id/usb-…-port0.- radio.module.modelstring: sr_frs or sa818
The module model.
Default:
sr_frs. Example:sr_frs.- radio.module.bandstring: vhf or uhf
The band of the module.
Default: empty. Example:
uhf.- radio.module.rx_freqstring
The receive frequency in MHz.
Default: empty. Example:
"446.0000".- radio.module.tx_freqstring
The transmit frequency. Empty uses rx_freq.
Default: empty. Example:
"446.0000".- radio.module.bandwidthstring: 25 or 12.5
The channel width in kHz.
Default:
25. Example:"12.5".- radio.module.rx_tonestring
The receive CTCSS tone in Hz, or a DCS code (SA818 only). Empty means none.
Default: empty. Example:
"100.0".- radio.module.tx_tonestring
The transmit tone, in the same form as rx_tone.
Default: empty. Example:
"100.0".- radio.module.squelchinteger, 0 to 8
The squelch level.
Default:
4. Example:4.- radio.module.volumeinteger, 1 to 8
The audio volume.
Default:
8. Example:8.- radio.module.micinteger, 1 to 8
SR_FRS only: the microphone level.
Default:
6. Example:6.- radio.module.busy_lockboolean
Do not transmit while the module receives a signal.
Default:
false. Example:true.- radio.module.companderboolean
The compander.
Default:
false. Example:false.- radio.module.low_powerboolean
Low power.
Default:
false. Example:true.- radio.module.emphasisboolean
SA818 pre-emphasis and de-emphasis.
Default:
true. Example:true.- radio.module.high_passboolean
SA818 high-pass filter.
Default:
true. Example:true.- radio.module.low_passboolean
SA818 low-pass filter.
Default:
true. Example:true.- radio.module.tailboolean
Squelch tail elimination.
Default:
false. Example:true.- radio.module.program_on_startboolean
Write the settings to the module at each start.
Default:
false. Example:true.
web #
The dashboard, the accounts and HTTPS. For the whole install.
- web.listenstring
The address and TCP port of the dashboard.
Default:
:7373. Example::7373.- web.publicboolean
Anyone can see the dashboard without a sign-in. It is the default of the Public dashboard switch for a module with no
accessblock.A visitor who is not signed in sees the callsign of an account, not its user name. An account without a callsign shows as
user.Default:
false. Example:true.- web.public_listenboolean
Anyone can listen without a sign-in. It is the default of the Public listen switch for a module with no
accessblock.How many may listen at one time is set by
web.listen_slotsandweb.public_listen_slots. Each signed-in user, or each address of a visitor who is not signed in, can have at most 8 audio connections and 32 page connections. The node accepts at most 256 audio and 1024 page connections in total. A connection over one of these limits closes with a reason that the page shows.Default:
false. Example:true.- web.userslist
The dashboard accounts. The keys are below.
Default: empty. Example: see below.
- web.users[].namestring
The user name.
Default: none. Example:
n0call.- web.users[].passwordsecret
A password. Mutara changes a written password into password_hash at the next save.
Default: empty. Example:
{env: MUTARA_ADMIN_PASSWORD}.- web.users[].password_hashstring
A bcrypt hash. mutara -hash-password makes one.
Default: empty. Example:
$2a$10$….- web.users[].callsignstring
The callsign of the user.
Default: empty. Example:
N0CALL.- web.users[].role, transmit, rf, modulesold keys
The old form of the rights, before access groups. A file with them still loads: Mutara turns them into groups and grants when it reads the file, with the same rights as before, and the next start writes the new form. A later release stops reading them. Do not use them in a new file. Read The old keys.
- web.groupslist
The access groups of the install. Each group has a
name(1 to 32 lower-case letters, digits and hyphens) andmembers(account names). Theadminsgroup lists the install admins: they may do everything on every module, and only they may change the settings of the install, the groups and the grants. It must have one member or more.everyone(each visitor, signed in or not) andusers(each signed-in account) are built in and have no members list.Default: empty. Example:
[{name: admins, members: [n0call]}, {name: club, members: [w1aw, k1abc]}].- web.access_defaultsgroups and users
The grants on a module with no
accessblock.groupsmaps a group to a list of actions, andusersmaps an account to a list of actions. Settings shows it as Defaults for new modules.Default: empty. Example:
{groups: {users: [listen, chat_read, clips, download]}}.- web.tls_certstring
A certificate file for HTTPS.
Default: empty. Example:
/etc/mutara/cert.pem.- web.tls_keystring
The key file of the certificate.
Default: empty. Example:
/etc/mutara/key.pem.- web.autocert_domainstring
Get a Let's Encrypt certificate for this domain. Needs TCP port 80.
Default: empty. Example:
node.example.net.- web.autocert_dirstring
The Let's Encrypt cache. Empty means mutara-certs/ in the state folder.
Default: empty. Example:
/var/lib/mutara/mutara-certs.- web.talk_limitduration, 10s to 30m
The node unkeys a browser that talks longer than this.
Default:
90s. Example:2m.- web.listen_slotsinteger, 1 to 256
The most listeners at one time: signed-in users and visitors together. One listener slot is one audio connection: the audio of one node, or the scan (one slot for all the nodes it plays). Viewing the status needs no slot. Admins are not counted and always get a slot. Settings shows it as Most listeners on the Access page. A change applies to new connections at once; nobody who listens now is cut off.
When all slots are in use, a signed-in user takes the slot of the visitor who has heard no audio for the longest time. That visitor gets a warning, and the connection closes 10 seconds later. When no visitor can give a slot, the listener waits in line and hears the audio when a slot becomes free. Signed-in users wait in front of visitors. The line holds at most 64 listeners, and a listener waits at most 30 minutes.
Default:
64. Example:16.- web.public_listen_slotsinteger, 0 to web.listen_slots
The most slots of
web.listen_slotsthat visitors who are not signed in may hold. It is part of the total, not added to it.0means that visitors cannot listen; they can still see a public node. Settings shows it as Most public listeners.Default:
16, orweb.listen_slotswhen that is smaller. Example:0.- web.encoder_levelauto, or 0 to 4
The level of the Opus encoders that send audio to browsers and apps. Level 4 is the full profile. Each lower level uses about half the CPU of the level above, with a small loss of sound quality. Level 0 also turns off the error correction that helps listeners on a weak connection. The node encodes each stream once for all the listeners who hear the same audio.
autostarts at a level that suits the board, lowers the level when encoding takes too much of the CPU, and raises it again when the CPU has room for a while. The dashboard shows the level now as Encoder, and at the bottom of each page. A change applies at once, with no restart. A change toautoruns the start test again. Read Listener encoder levels.Default:
auto. Example:2.- web.chat.enabledboolean
The text chat.
Default:
true. Example:true.- web.chat.listenersold key: read, post or none
What accounts with the old role
listenercould do in the chat. It still loads with the other old keys. In the new form, thechat_readandchat_postactions say who may read and post.- web.chat.retentionduration, 10m to 720h
The node deletes messages and files after this time.
Default:
24h. Example:48h.- web.chat.max_file_kbinteger, up to 20480
The largest attached file in KB.
Default:
1024. Example:2048.- web.chat.max_total_mbinteger, up to 10240
The limit for all attached files in MB.
Default:
100. Example:200.- web.bundle_linksboolean
The owner of a bundle can make a public link to it. People without an account can then open the bundle for a time. Turn it off to stop all links at once. A room also needs
room.bundle_links. Settings shows it as Public links to bundles on the Accounts and groups page. Read Share a bundle with a link.Default:
false. Example:true.- web.roomold key: enabled and open_mic
The off-the-air room of older releases. At the first start, Mutara makes the room module
roomfrom it (modules.d/room.yaml, withopen_miccopied), removesweb.roomand writesweb.room_migrated: true. Whenweb.room.enabledisfalse, Mutara makes no room. When the IDroomis in use, the ID isroom-2, thenroom-3. A file withweb.roomstill loads. Do not use it in a new file.- web.room_migratedboolean
Mutara writes it when the old room is a room module, and at first-run setup. Do not change it.
Default:
false.
access #
Who may do what on one module. The first module's block is in mutara.yaml; another module's block is in its own file. A module with no block uses the defaults: web.public, web.public_listen and web.access_defaults. The Access section of the module's settings page writes it.
# /etc/mutara/modules.d/2101.yaml
access:
public: true # everyone: view
public_listen: false # everyone: listen
groups:
users: [listen, chat_read, clips]
club: [listen, talk, chat_post, clips, download]
users:
w1aw: [link, dtmf, manage]
- access.publicboolean
Anyone can see this module without a sign-in.
Default:
false. Example:true.- access.public_listenboolean
Anyone can listen to this module without a sign-in. It also gives view.
Default:
false. Example:true.- access.groupsmap: group to actions
The actions of each group on this module:
everyone,users, or a group ofweb.groups. Theadminsgroup needs no grants.Default: empty. Example:
{users: [listen]}.- access.usersmap: account to actions
The own actions of an account on this module.
Default: empty. Example:
{w1aw: [talk]}.
The actions:
view: see the module, its status, events and last heard.listen: hear the module and scan it. It givesview.talk: talk on the module from the browser or the app.rf: that audio goes to the local radio too. Without it, it stays on the network.link: link and unlink, and read the favorites.dtmf: send DTMF from the keypad.allstar.function_accessstill says which commands run.chat_readandchat_post: read and post in the module's chat.chat_postgiveschat_read.clips: list and play the clips.download: save and share a clip. It givesclips. A user who can play a clip can still record it, so this only removes the buttons.bundles: make a bundle of clips, and send a clip to speech to text. It giveslisten,viewandclips. Nobody has it by default; give it to a group, for examplenet-control. Read Who may do what with bundles.manage: the module's own settings, tones, levels and commands, kick, favorites, and delete clips, bundles and chat messages. It does not give the other actions, and it does not let a user change the grants.
The rights of a user on a module add up: the everyone grants, the users grants when signed in, the grants of each group of the user, and the user's own grants. No grant takes a right away. An admin may do everything. A change applies at once, also to an open connection.
The old keys
Before access groups, each account had a role (listener, operator or admin), transmit, rf and a modules list, and web.chat.listeners set the chat of listeners. A file with these keys still loads. Mutara turns them into groups and grants in memory, with the same rights:
role: adminbecomes a member ofadmins.role: listenerbecomes grants on theusersgroup:listen,clips,download, and the chat ofweb.chat.listeners.role: operatorbecomes a member of a new groupoperatorswithlisten,link,dtmf,chat_post,clipsanddownload.transmitandrfbecome the account's owntalkandrf.- An account with a
moduleslist gets its rights only on those modules. The other listeners then go in a new grouplisteners. web.public_listengivesviewtoo.
At start, Mutara writes mutara.yaml in the new form, and the module files that need an access block. First it keeps a copy of each file next to it, for example mutara.yaml.bak-20261017-123000 (mode 0600, same owner). Only the access keys change; the other settings and the comments stay. The service log has one Info line for each file that it writes. A second start finds nothing to change.
Mutara writes the files only when the rights stay exactly the same. It calculates the rights of each account and of a visitor on each module before and after, and checks that the new files load. If something is different, it writes nothing, the old keys load as before, and a Warn line tells what would change. An example: an account with role: admin and no transmit may not talk, but an admin in the new form may do everything. In that case, save the access settings once from Settings to write the new form.
mutara -check-config writes nothing. It tells which files the next start writes, or why it does not write them. The first save from Settings also writes the new form, and keeps the old file as .bak. A later release stops reading the old keys.
update #
Release checks. For the whole install.
- update.checkboolean
Look for new releases every 6 hours.
Default:
true. Example:false.- update.urlstring
Where to look. Empty means the Mutara website.
Default: empty. Example: empty.
voice_server #
An optional Kokoro voice server. For the whole install.
- voice_server.urlstring
The address of the voice server. Do not put it on the internet.
Default: empty. Example:
http://127.0.0.1:7374.- voice_server.voicestring
The voice, in the form xx_name.
Default:
af_sarah. Example:bf_emma.- voice_server.speednumber, 0.5 to 2
The speech speed.
Default:
0.8. Example:0.9.- voice_server.timeoutduration, 1s to 30s
How long to wait for the server.
Default:
5s. Example:5s.- voice_server.id_textstring, 200 characters at most
The text of a voice ID. It must contain the callsign.
Default: empty. Example:
This is N0CALL, Mutara node 2 1 0 0.
When the voice server also has speech to text, Mutara makes transcripts of clips and bundles with it. Mutara finds this out from the server's /health and /stats. You set nothing more. Read Transcripts.
weather #
Weather alerts from api.weather.gov (US only). Needs voice_server.url and a location.
- weather.enabledboolean
Speak weather alerts.
Default:
false. Example:true.- weather.latitudenumber
The position of the station.
Default: none. Example:
39.05.- weather.longitudenumber
The position of the station.
Default: none. Example:
-95.68.- weather.zoneslist of strings
The county and zone codes.
Default: empty. Example:
[KSC177, KSZ039].- weather.area_namestring
The name that the node says in the alerts.
Default: empty. Example:
Example County.- weather.groupslist of strings
tornado, thunderstorm, flood, tropical, tsunami, winter, wind, cold_heat, fire, dust, fog.
Default: all. Example:
[tornado, thunderstorm, flood].- weather.all_clearboolean
Say when the last alert ends.
Default:
true. Example:true.- weather.pollduration, 30s to 1h
How often the node gets the alerts.
Default:
60s. Example:60s.- weather.tail_intervalduration: 0, or 1m to 24h
Say the alerts after a conversation, at most this often.
Default:
10m. Example:15m.- weather.stationstring
The weather station for the current weather. Empty uses the nearest.
Default: empty. Example:
KTOP.- weather.unitsstring: imperial or metric
The units for the current weather.
Default:
imperial. Example:metric.- weather.report_intervalduration: 0, or 15m to 24h
Say the current weather at this interval. It must divide a day evenly.
Default: 0 (only on *76). Example:
1h.
recording #
Recorded clips.
- recording.enabledboolean
Record talkers.
Default:
false. Example:true.- recording.hoursstring
The first and last hour to record. Empty means all day.
Default: empty. Example:
22-6.- recording.min_lengthduration, up to 1m
Drop shorter clips.
Default:
2s. Example:3s.- recording.keep_daysinteger, 1 to 365
Delete older clips.
Default:
7. Example:14.- recording.max_total_mbinteger, up to 102400
Over this, delete the oldest clips first.
Default:
500. Example:1000.- recording.bundles.enabledboolean
Users with the
bundlesaction can join clips into a bundle. Settings shows it as Bundles on the Recorded clips page. Read Bundles and transcripts.Default:
true. Example:false.- recording.bundles.max_keepstring: 1d, 7d, 30d or forever
The longest time that a user can keep a bundle. A shorter value also applies to the bundles that are there now. Settings shows it as Longest keep time.
Default:
30d. Example:7d.- recording.bundles.max_total_mbinteger, 1 to 102400
The limit for all the bundles of the module together, in MB. When a new bundle does not fit, the node refuses it. It never deletes a bundle to make space. Settings shows it as Bundle storage limit (MB).
Default:
1000. Example:2000.- recording.bundles.hintstring, 200 characters at most
Words that the speech to text hears often on this module, such as the name of the net. The node adds the callsigns of the talkers. Settings shows it as Transcript hint.
Default: empty. Example:
Net control, check in, traffic.
log #
The log. For the whole install.
- log.levelstring: debug, info, warn or error
The log level.
Default:
info. Example:debug.- log.formatstring: text or json
The log format.
Default:
text. Example:json.
Module files #
Each node after the first is in its own file, modules.d/<node>.yaml, next to mutara.yaml.
# /etc/mutara/modules.d/2101.yaml
type: allstar
node:
callsign: W1AW
name: Club hub
allstar:
enabled: true
node: "2101"
password: {env: MUTARA_2101_PASSWORD}
register: true
typeisallstar,ysf,dmrorm17.- A module file can have
node,allstar,weather,recording,accessandopusref(on hold). web,update,logandvoice_serverare only inmutara.yaml.- All modules use the IAX2 port of
mutara.yaml. Do not setlisten,public_port,require_calltoken,node_db,dns_domainornodelist_urlto a different value. - Each node number is used one time only. Only the first module can have a radio.
weatherin a module file can set onlyenabled,tail_intervalandreport_interval.- Before Mutara writes a file from Settings, it checks all modules together. If two modules clash, it writes nothing.
When you remove a module in Settings, Mutara deletes its file and moves its state folder to modules/.removed/<id>-<date>-<time>/ in the state folder. Mutara does not delete the clips, the chat or the favorites.
YSF module files
A ysf module links to one YSF reflector. Its ID is the name of the file. It has no radio.
# /etc/mutara/modules.d/ysf-club.yaml
type: ysf
name: Club reflector
callsign: KD2XYZ # empty uses the callsign of mutara.yaml
local_number: "2350" # the number that the nodes of this install dial
ysf:
reflector: ysf.example.net:42000
# dgid: 0 # only for reflectors that use DG-ID
# tx_limit: 3m # longest transmission to the reflector (30s to 30m)
link: # optional
module: "2100" # the AllStar node of this install that links
permanent: true # link at start and after a restart
# mode: monitor # the node hears the reflector and sends nothing
rx_agc: true # auto level for the reflector's audio (default on)
rx_gain_db: 0 # fixed gain when rx_agc is false: -12 to +24 dB
tx_agc: false # auto level for the audio to the reflector (default off)
tx_gain_db: -9 # vocoder level when tx_agc is false: -12 to +24 dB (default -9)
max_boost_db: 18 # the most that auto level turns audio up: 0 to 30
scan_priority: 0 # default scan priority: 0 to 99
recording:
enabled: true
- The local number is for this install only. It must not be the number of a node or another local number. On node 2100,
*32350links to the module and*12350drops the link. link.modulemust be an AllStar node of this install with AllStar on. The link is a local link. It is not in the link lists that the node sends to the AllStar network.- Auto level brings speech toward an average of −25 dBFS. A limiter keeps the peaks under −6 dBFS. Only an admin can change the levels.
- The audio to the reflector has a fixed vocoder level by default:
tx_agcis off andtx_gain_dbis −9 dB from the AllStar level, so about −34 dBFS goes into the vocoder. This suits most radios. Turntx_agcon only if a reflector needs it. A value in the file always wins. - The levels,
recordingandscan_priorityapply at once. A change to the other settings restarts only this module. - The module needs the transcoder server. Read tcdpool.
DMR module files
A dmr module logs in to one DMR master as a hotspot (MMDVM Homebrew protocol) and listens to one talkgroup on one timeslot. It listens only until you set dmr.talk: true. Then users who may talk can talk on the talkgroup. Its ID is the name of the file. It has no radio. Mutara is tested with BrandMeister only.
# /etc/mutara/modules.d/dmr-3100.yaml
type: dmr
name: TG 3100
callsign: N0CALL # the callsign of the owner of the DMR ID
local_number: "2351" # the number that the nodes of this install dial
dmr:
master: master.example.net:62031
password: {file: /etc/mutara/dmr-3100.secret} # or {env: MUTARA_DMR_PASSWORD}
dmr_id: 3100001 # your DMR ID: 7 digits
essid: 1 # 1 to 99; the login ID is dmr_id × 100 + essid
timeslot: 2 # 1 or 2
talkgroup: 3100 # 1 to 16777215
talk: false # true: users who may talk can talk on the talkgroup
# options: "" # RPTO line, for masters that use one; empty on BrandMeister
rptc: # station data for the master. Set these: a master
# can refuse a login with 0 values (BrandMeister does)
rx_freq: 431000000 # Hz; not 0
tx_freq: 431000000 # Hz; not 0
power: 1 # dBm, 0 to 99; not 0
height: 10 # antenna height in metres, 0 to 999; not 0
latitude: 41.7148 # your station's position
longitude: -72.7272
location: Newington, CT # up to 20 characters; default: the weather area name, else Mutara
# description: "" # up to 19 characters; default: the module name
# url: "" # up to 124 characters
# color_code: 1 # 0 to 15
# software_id: Mutara # BrandMeister refuses Mutara: use "20260713"
# package_id: Mutara <version> # BrandMeister: use MMDVM
link: # optional
module: "2100" # the AllStar node of this install that hears the talkgroup
permanent: true # link at start and after a restart
# mode: transceive # with talk on: the node's audio also goes to the talkgroup
tx_limit: 3m # with talk on: the longest call, 30s to 30m
tx_agc: false # with talk on: auto level for the audio to the talkgroup (default off)
tx_gain_db: -9 # vocoder level when tx_agc is false: -12 to +24 dB (default -9)
rx_agc: true # auto level for the talkgroup's audio (default on)
rx_gain_db: 0 # fixed gain when rx_agc is false: -12 to +24 dB
max_boost_db: 18 # the most that auto level turns audio up: 0 to 30
scan_priority: 0 # default scan priority: 0 to 99
recording:
enabled: true
- Make the talkgroup static for the login ID at your network before you start. The master sends a talkgroup to a hotspot only when it is static. On BrandMeister, do this in SelfCare. Mutara makes no dynamic links.
passwordis a secret: a file, the environment, or a value. Mutara never logs it or shows it. Settings writes it in the module file, which only the owner can read.- The login ID is
dmr_id× 100 +essid, ordmr_idwith noessid. Twodmrmodules cannot have the same login ID. - Set the
rptcstation data: the frequencies, the power, the height and the position. When a value is 0, a master can refuse the login or close the link at once. BrandMeister does this. BrandMeister also refuses the software IDMutara: usesoftware_id: "20260713"andpackage_id: MMDVM. mastermust be a host and a UDP port. A value inrptcthat is too long is refused. A default that is too long is cut.- The module hears only group calls to the talkgroup on the timeslot. It drops other talkgroups, the other timeslot, private calls and data, and Settings > Health counts them.
talkis off by default. With it on, a signed-in user with the right to talk on the module talks on the talkgroup, one local talker at a time. A call uses the user's own DMR ID (each user sets it in the profile on the dashboard), elsedmr_id. PTT waits while a call comes from the talkgroup.tx_limitends a call that is too long.- The local number and
link.modulefollow the rules of a YSF module. The linked node hears the talkgroup. Withtalkon andlink.mode: transceive, the talkgroup also hears the node. Else the talkgroup does not hear the node. - As on a YSF module, the audio to the talkgroup has a fixed vocoder level of −9 dB by default, with
tx_agcoff. - The levels,
recordingandscan_priorityapply at once. A change to the other settings, for example the talkgroup, restarts only this module. - The module needs the transcoder server. Read tcdpool.
M17 module files
An m17 module links to one module of an M17 reflector, as a hotspot does. It listens only until you set m17.talk: true. Then users who may talk can talk on the reflector module. Its ID is the name of the file. It has no radio. Mutara uses the protocol of urfd.
# /etc/mutara/modules.d/m17-club.yaml
type: m17
name: M17 club
callsign: N0CALL # up to 8 characters; empty uses the callsign of mutara.yaml
local_number: "2350" # the number that the nodes of this install dial
m17:
host: m17.example.net # a host name or an IP address, with no port
port: 17000 # the UDP port of the reflector (default 17000)
module: A # the reflector module: A to Z
# callsign: "" # the link callsign, up to 9 characters; default "N0CALL A"
talk: false # true: users who may talk can talk on the reflector module
link: # optional
module: "2100" # the AllStar node of this install that hears the reflector
permanent: true # link at start and after a restart
# mode: transceive # with talk on: the node's audio also goes to the reflector
tx_limit: 3m # with talk on: the longest transmission, 30s to 30m
tx_agc: false # with talk on: auto level for the audio to the reflector (default off)
tx_gain_db: -9 # vocoder level when tx_agc is false: -12 to +24 dB (default -9)
rx_agc: true # auto level for the reflector's audio (default on)
rx_gain_db: 0 # fixed gain when rx_agc is false: -12 to +24 dB
max_boost_db: 18 # the most that auto level turns audio up: 0 to 30
scan_priority: 0 # default scan priority: 0 to 99
recording:
enabled: true
- m17.hoststring
The host name or IP address of the reflector. It is necessary. A host with a port in it is refused: put the port in
m17.port.Default: none. Example:
m17.example.net.- m17.portinteger
The UDP port of the reflector, from 1 to 65535.
Default:
17000.- m17.modulestring
The reflector module: one letter from
AtoZ. Lower case changes to upper case.Default: none. Example:
A.- m17.callsignstring
The link callsign: the name of the module on the reflector, 1 to 9 characters (
AtoZ,0to9,-,/and.). Empty uses the module's callsign, filled with spaces to 8 characters, and the module letter.Default: empty, for example
N0CALL A.- m17.talkboolean
Lets users who may talk talk on the reflector module. Off, the module sends nothing but the link packets.
Default:
false.
- The module's
callsigncan have 8 characters at most whenm17.callsignis empty. A callsign with a character that M17 cannot send is refused. - Two
m17modules with the same link callsign to the same host and port are refused. Give each one its ownm17.moduleorm17.callsign. - A stream to the reflector has the user's own M17 callsign as its source (each user sets it in the profile on the dashboard), else the callsign of the user's account, else the module's callsign. The linked node uses the module's callsign. The destination is
@ALL. - The local number and
link.modulefollow the rules of a YSF module. Withtalkon andlink.mode: transceive, the reflector also hears the node. - The module does not play Codec2 1600 streams, encrypted streams or packet data.
- Known issue: urfd can drop a stream from an M17 client that sends the destination
M17-<reflector> <module>in place of@ALL, for example the QSO One app. The module then does not hear that client. A fix for urfd is in progress. - The levels,
recordingandscan_priorityapply at once. A change to the other settings, for example the module letter, restarts only this module. - The module needs the transcoder server (Codec2 3200). Read tcdpool.
Room module files
A room module is a push-to-talk room for the users of this install. It is never on the air: it has no node, no links, no radio and no AllStar. Its members hear each other. Its ID is the name of the file. An install can have many rooms.
# /etc/mutara/modules.d/net-team.yaml
type: room
name: Net team
room:
open_mic: true # members who may talk can use open mic (default on)
open_mic_idle: 30m # open mic turns off after this long with no speech; 0 is off
talk: transmit # transmit (default) or grants
max_members: 20 # most members at one time, 2 to 256
talk_threshold: 3m # the room stops a longer transmission; 0 is off
transcripts: true # the voice server may transcribe the clips (default on)
bundle_links: false # public links to the room's bundles (default off)
scan_list: false # in the default scan list (default off)
scan_priority: 0 # default scan priority: 0 to 99
recording:
enabled: true # on when not set in a room file
keep_days: 7
access:
public: false
public_listen: false # true: visitors can listen; they never talk
groups:
net-control: [view, listen, talk, chat_post, clips, bundles]
users:
kd2xyz: [talk]
- room.open_micboolean
Members who may talk can use open mic: the room hears them when they speak, without PTT.
Default:
true.- room.open_mic_idleduration, 0 or 1m to 24h
A member's open mic turns off after this long with no speech.
0is off.Default:
30m.- room.talktransmit or grants
transmit: a signed-in user may talk who may talk on a module of the install that is not a room, or who hastalkon the room.grants: only thetalkgrants of the room'saccessblock.Default:
transmit.- room.max_membersinteger, 2 to 256
The most members at one time. A member is one audio connection. Users with
manageon the room are not counted and always get in. Room members do not useweb.listen_slots.Default:
20.- room.talk_thresholdduration, 0 or 30s to 30m
The room stops one PTT transmission or one open mic talkspurt that is longer than this. The member cannot talk for 10 s.
0is off.web.talk_limitalso applies to PTT; the shorter one wins.Default:
3m.- room.transcriptsboolean
The voice server can make transcripts of the clips and bundles of the room. The room audio then goes to the voice server. Turn it off when the room must stay private.
Default:
true.- room.bundle_linksboolean
The owner of a bundle of this room can make a public link to it. This also needs
web.bundle_links.Default:
false.
- A room has the actions
view,listen,talk,chat_read,chat_post,clips,download,bundlesandmanage. A grant ofrf,linkordtmfin a room file is an error. - A room with no
accessblock does not useweb.access_defaults. Theusersgroup hasview,listen,chat_read,chat_postandclips, and visitors cannot listen. manageon a room gives its settings, Interrupt, Stop, Remove (a ban of 10 minutes from that room), and the delete of its clips, bundles and chat messages. Stop mutes the user for 10 s on all the user's connections to the room.recording.enabledis on when it is not set. The room records each talker in a clip of its own. The clip of a manager's Interrupt has the taginterrupt.- Nothing links to a room. A
link.modulethat names a room is an error, and a link request to a room gets 409 (Conflict). - All the room settings apply at once. A lower
room.max_memberscuts nobody off.
scan_priority
The default scan priority of a module, from 0 to 99. 0 is no priority. The default is 0.
- The first module:
node.scan_priorityinmutara.yaml. - Another AllStar module:
node.scan_priorityinmodules.d/<node>.yaml. - A YSF, DMR, M17 or room module:
scan_priorityinmodules.d/<id>.yaml.
A change applies at once. The own values of each user are not in these files. The node keeps them in scan-priority.json in the state folder. Read Set the priority of a module.
scan_list
Whether the module is in the default scan list: true or false. Scan my list plays the modules in the user's list, and Scan all plays a room only when it is in the user's list.
- The first module:
node.scan_listinmutara.yaml. When not set: in the list. - Another AllStar module:
node.scan_listinmodules.d/<node>.yaml. When not set: in the list. - A YSF, DMR or M17 module:
scan_listinmodules.d/<id>.yaml. When not set: in the list. - A room module:
scan_listinmodules.d/<id>.yaml. When not set: not in the list.
A change applies at once. The own values of each user are not in these files. The node keeps them in scan-list.json in the state folder. Read Make your scan list.
tcdpool #
YSF and DMR voice use the AMBE+2 codec, and M17 voice uses Codec2 3200. Mutara does not have these codecs. A tcdpool transcoder server converts the voice for Mutara, over a WebSocket with TLS. The source of the transcoder server and its build and setup steps are in the mutara-radio/tcdpool project on GitHub. If you use the server of someone else, the operator of the server gives you the address and a key. Set them in mutara.yaml, or on the Transcoder page of Settings.
tcdpool:
url: wss://tcd.example.net:8443
key: {env: MUTARA_TCDPOOL_KEY} # "<key id>.<secret>"
# cert_sha256: <64 hex digits> # only for a self-signed certificate
# warm: 2 # free sessions that stay open (0 to 16)
# max_sessions: 0 # the most sessions; 0 is the limit of the key
- tcdpool.urlstring
The address of the server. Empty is off: then YSF, DMR and M17 modules pass no voice.
Default: empty. Example:
wss://tcd.example.net:8443.- tcdpool.keysecret
The key of the install,
<key id>.<secret>. It can come from the environment or a file. The log and the Settings page do not show it.Default: empty.
- tcdpool.cert_sha256string
Pins the certificate of the server: the SHA-256 of the certificate or of its public key, in hex. Use it only for a self-signed certificate.
Default: empty (the usual certificate check).
- tcdpool.warmnumber
The free sessions that stay open, so that a new call starts at once. 0 to 16, and not more than
max_sessionswhen that is set. A change applies at once.Default: 2.
- tcdpool.max_sessionsnumber
The most sessions that the pool opens. 0 uses the session limit of the key, from the server status. A lower number leaves sessions of the key for other installs. 0 to 16. A change applies at once.
Default: 0.
tcdpoolis only inmutara.yaml. A change towarmormax_sessionsapplies at once. A change to the other keys restarts all of Mutara.- All YSF, DMR and M17 modules share one pool of sessions on the server:
<install ID>:pool-0,pool-1and so on. Mutara keeps the install ID ininstall-idin the state folder. Do not delete or change this file. - A call takes a session when it starts and gives it back when it ends. One session carries one call at a time. The module decodes each call, also when nobody listens. A free session above
warmcloses after 60 s with no call. - When no session is free, a new call waits up to 300 ms, and the module keeps its first frames. The order is: a local talker; a module that a user listens to, or that a scan plays now; the higher scan priority; then the first call. After 300 ms the call passes no voice, and Health counts it as a call with no transcoder. A running call never loses its session.
- Settings > Health has a Transcoder pool panel: the sessions open, in use and free, the key limit, the peaks, the calls with no transcoder, and the last 200 events of the pool, for example
Opened pool-2 (grow, 35 ms)andClosed pool-3 (idle 60 s). - When the server is not available, the YSF module stays linked to the reflector, and the DMR module stays logged in to the master, but no voice goes through. Settings > Health shows the cause.
- While a YSF, DMR or M17 module runs, Mutara reads the status of the server each 30 s, with the same key. Modules that use the same server share one read. Settings > Health, the page of the module and the diagnostics report show it: for example
Transcoder server: busy, 6 of 8 processesandSessions for this key: 2 of 4, with the CPU load, the late replies, the version and the time of the check. The state isok,busyorfull. An older server has no status: Health showsstatus not available. - When the server has no room for a session, Health tells why, for example: The transcoder server has no free session for this key: 4 of 4 in use.
dmr_db #
The DMR ID list gives the callsign and the first name of each DMR talker. Then the activity log shows W1AW John (3100001) in place of DMR 3100001, and Last heard and the clips show W1AW John (DMR). Set it in mutara.yaml, or on the page of a DMR module in Settings > Modules (Talker names).
dmr_db:
enabled: true
# url: https://radioid.net/static/user.csv
- dmr_db.enabledboolean
Download the DMR ID list each day. Mutara downloads it only when the install has a
dmrmodule.Default:
false. Example:true.- dmr_db.urlstring
A different list, http or https. The first line names the columns, for example
RADIO_ID,CALLSIGN,FIRST_NAME. Mutara reads only the ID, the callsign and the first name.Default: empty (
https://radioid.net/static/user.csv).
dmr_dbis only inmutara.yaml. Alldmrmodules use one list. A change applies after a restart.- Mutara keeps the list as
dmrids.csvin the state folder. It checks for changes each day, with a conditional request. When a download fails, it keeps the last good list and tries again after 30 minutes, then after longer times, up to 6 hours. A list with no rows, or with less than half of the rows of the last good list, is refused. - The list uses about 24 bytes of memory for each ID: about 6 MB for 250,000 IDs.
- An ID that is not in the list shows as
DMR 3100001. When the list gets the ID later, older entries in Last heard, the activity log and the clips show the name too.