A utility for managing Digital Repeater (DR) lists compatible with any ICOM transceiver that has DR mode
Manage • Validate • Import • Export • Delete
Features • Requirements • Installation • CSV Format • Menu Structure • Field Reference • Validation Rules • Usage Tips • Logging
Any ICOM transceiver equipped with DR mode (ID-31, ID-51, ID-52, ID-5100, IC-9700, and similar models) can load a structured repeater list through the respective CS programming software. DR_list_manager.sh provides a fully interactive, menu-driven TUI (Text User Interface) to build and maintain that list directly in the terminal — no GUI tools required. Entries are stored in a plain CSV file that can be exported and imported directly into the ICOM programming software. Designed for the Amateur Radio community, with locale-aware formatting can be easily applied in any scenario.
- Interactive TUI — dynamic headers and separators that adapt to any terminal width (up to 80 columns)
- Three operating modes — DV (D-Star), FM, and FM-N, each with mode-specific field logic
- Group management — organize repeaters into up to 50 named groups; rename or remove groups with automatic cascading updates
- Full CRUD — add, edit, and delete repeaters through guided prompts
- Advanced search — query the database using up to 3 combined filters (Group, Mode, RPT1USE, Call Sign, Frequency) with paginated results
- Field validation — per-field rules enforce correct callsigns, frequencies, offsets, CTCSS tones, and text length limits
- Duplicate detection — catches repeated entries (same group + name + frequency) before they cause issues in the radio
- Callsign conflict detection — prevents a DV callsign from being reused in any other mode, and blocks the same FM/FM-N callsign from appearing in the same band twice
- Automatic corrections — decimal separators (
.→,), missingHzsuffix on tones, and mismatched offset values are fixed automatically during validation - CSV import with merge — import an external CSV and choose to replace or append to the current database; group name conflicts are resolved interactively
- Export with sequential naming — exports are saved as
RptYYYYMMDD_XX.csvwith auto-incrementing sequence numbers - Database deletion — safely delete CSV files from the file list with double-confirmation protection
- Instance locking — a PID-based lock file (
/tmp/dr_list_manager.lock) prevents multiple simultaneous instances - Operation log — all add, edit, delete, import, and export actions are timestamped in
dr_manager.logwith detailed correction records - Universal cancel — press
Xat any prompt to abort the current operation and return to the previous menu - Colorized prompts — default values highlighted in orange for quick visual reference
- Locale-aware formatting — uses
;as the column separator and,as the decimal separator
| Dependency | Notes |
|---|---|
| Bash 4.0+ | Associative arrays required |
awk |
Field parsing and in-place updates |
grep |
Pattern matching |
sed |
Text substitution |
tput |
Terminal width/height detection |
mktemp |
Safe temporary file creation |
date |
Log timestamps and export filenames |
No external packages or internet access required. Runs entirely offline.
# Clone the repository
git clone https://github.com/PP5KX/DR_List_Manager.git
cd DR_List_Manager
# Make the script executable
chmod +x DR_list_manager.sh
# Run
./DR_list_manager.shOn startup, the script automatically loads Repeater_list.csv from the current directory if it exists. A different base file can be selected at runtime from the Manage Database menu (Option 5 → 1).
⚠️ Locale formatting — importantThis application uses the following conventions, matching Brazilian system locale and the ICOM CS programming software behavior under
pt_BR:
- Column separator:
;(semicolon)- Decimal separator:
,(comma)Files using
.(period) as a decimal separator or,(comma) as a column separator will not parse correctly. The validator can auto-correct period-based decimals during import.
The CSV contains 17 columns in the following order:
| # | Column | Description | Example |
|---|---|---|---|
| 1 | Group No |
Group number (1–50) | 4 |
| 2 | Group Name |
Display name of the group (max 16 chars) | Santa Catarina |
| 3 | Name |
Repeater display name (max 16 chars) | Florianopolis |
| 4 | Sub Name |
Secondary label (max 8 chars) | Centro |
| 5 | Repeater Call Sign |
Local repeater callsign (max 8 chars) | PP5ZFP B |
| 6 | Gateway Call Sign |
D-Star gateway callsign (DV only, max 8 chars) | PP5ZFP G |
| 7 | Frequency |
Receive frequency in MHz | 439,975000 |
| 8 | Dup |
Duplex direction | DUP- |
| 9 | Offset |
Frequency offset in MHz | 5,000000 |
| 10 | Mode |
Operating mode | DV |
| 11 | TONE |
Tone type | OFF |
| 12 | Repeater Tone |
CTCSS tone with Hz suffix | 88,5Hz |
| 13 | RPT1USE |
Whether RPT1 slot is used | YES |
| 14 | Position |
Coordinate precision level | Approximate |
| 15 | Latitude |
Geographic latitude | -27,597222 |
| 16 | Longitude |
Geographic longitude | -48,549167 |
| 17 | UTC Offset |
Time zone offset | -3:00 |
Group No;Group Name;Name;Sub Name;Repeater Call Sign;Gateway Call Sign;Frequency;Dup;Offset;Mode;TONE;Repeater Tone;RPT1USE;Position;Latitude;Longitude;UTC Offset
4;Santa Catarina;Florianopolis;Centro;PP5ZFP B;PP5ZFP G;439,975000;DUP-;5,000000;DV;OFF;88,5Hz;YES;Approximate;-27,597222;-48,549167;-3:00
4;Santa Catarina;Florianopolis;;PP5ZFP;;147,075000;DUP+;0,600000;FM;TSQL;88,5Hz;YES;Approximate;-27,597222;-48,549167;-3:00
5;Parana;Curitiba Simplex;;;;146,520000;OFF;0,000000;FM;OFF;88,5Hz;YES;None;0,000000;0,000000;-3:00
The bundled Repeater_list.csv follows a geographic convention suited to Brazil, though the structure is flexible enough to be adapted to any country or region:
- Group No / Group Name — each group represents a Brazilian state (e.g. Group 4 = Santa Catarina, Group 5 = Paraná). For other regions, groups could represent countries, provinces, counties, or any other division.
- Name — identifies the city or locality where the repeater is located (e.g.
Florianopolis,Curitiba). - Sub Name — an 8-character secondary label. Use it to add context when a city has multiple repeaters of the same mode, to indicate a club callsign abbreviation, a site name, or any other distinguishing detail, (e.g.
Centro,Serra,146MHz).
The diagram below shows the full navigation structure of the application. Every branch can be cancelled at any prompt by pressing X.
flowchart TD
START([▶ Start]) --> MAIN
MAIN["🏠 MAIN MENU
──────────────────
1 · Edit Repeaters
2 · Add Repeater
3 · Edit Groups
4 · Advanced Query
5 · Manage Database
X · Exit"]
MAIN -->|1| OPT1
MAIN -->|2| OPT2
MAIN -->|3| OPT3
MAIN -->|4| OPT4
MAIN -->|5| OPT5
MAIN -->|X| EXIT([🔴 Exit])
OPT1["📋 GROUP LIST
─────────────────────
Lists all groups
with station count"]
OPT1 --> GRPLIST["📄 REPEATER LIST
─────────────────────
Paginated list
sorted by name
─────────────────────
N · Next page
P · Prev page
B · Back to groups
X · Main menu"]
GRPLIST -->|Select №| DETAIL
DETAIL["🔍 REPEATER DETAIL
─────────────────────
Shows all 17 fields
─────────────────────
E · Edit
D · Delete
B · Back
X · Main menu"]
DETAIL -->|E| OPT2
DETAIL -->|D| CONFIRM_DEL{{"Confirm\ndelete?"}}
CONFIRM_DEL -->|y| DEL_OK(["✅ Deleted"])
CONFIRM_DEL -->|N| DETAIL
OPT2["✏️ ADD / EDIT FORM
─────────────────────
Group No → Name
Sub Name → Mode
Dup → Offset
Frequency → Call Sign
Gateway → TONE
RPT1USE → Position
Lat / Lon → UTC Offset
─────────────────────
Enter · keep default
X · cancel anytime"]
OPT2 --> SAVED(["✅ Saved to CSV"])
OPT3["👥 EDIT GROUPS
─────────────────────
1 · Rename Group
2 · Remove Group
X · Back"]
OPT3 -->|1| RENAME["Rename → updates
all linked entries"]
OPT3 -->|2| REMOVE["Remove →
Move to other group
or delete all entries"]
OPT4["🔎 ADVANCED QUERY
─────────────────────
Up to 3 filters:
· Group (exact)
· Mode (exact)
· RPT1USE (exact)
· Call Sign (partial)
· Frequency (partial)"]
OPT4 --> RESULTS["📊 PAGINATED RESULTS
─────────────────────
Sorted by group / name
─────────────────────
N · Next page
P · Prev page
S · New search
X · Main menu"]
RESULTS -->|Select №| DETAIL
OPT5["💾 MANAGE DATABASE
─────────────────────
1 · Select CSV file
2 · Import CSV
3 · Export CSV
4 · Validate database
5 · Delete database
6 · Clear database
X · Back"]
OPT5 -->|1| SEL["Select or create
a CSV base file"]
OPT5 -->|2| IMP["Validate external CSV
→ Replace or Append
→ Resolve group conflicts"]
OPT5 -->|3| EXP["Save as
RptYYYYMMDD_XX.csv"]
OPT5 -->|4| VAL["Validate active DB
Per-line: Correct /
Skip / Abort"]
OPT5 -->|5| DEL["Select CSV to delete
with double confirmation"]
OPT5 -->|6| CLR{{"Confirm
clear?"}}
CLR -->|y| CLEARED(["✅ Header only kept"])
CLR -->|N| OPT5
╔══════════════════════════════════════════════════════╗
║ REPEATER MANAGER - D-Star / FM ║
║ ICOM DR LIST v3.8_en ║
╚══════════════════════════════════════════════════════╝
File : Repeater_list.csv
Records : 142
Groups : 27
1. Edit Repeaters (List / Edit / Delete)
2. Add Repeater
3. Edit Groups (Rename / Remove)
4. General Query (Advanced Filters)
5. Manage Database
X. Exit System
═══════════════════════════════════════════════════════
Choose an option:
Displays all groups with their station count. Selecting a group opens a paginated list of its repeaters, sorted alphabetically by name.
╔══════════════════════════════════════════════════════╗
║ LIST OF REGISTERED GROUPS ║
╚══════════════════════════════════════════════════════╝
[01] - Acre ( 01 stations registered )
[02] - Alagoas ( 01 stations registered )
[04] - Santa Catarina ( 18 stations registered )
...
>> Type the group number (or [X] Main Menu):
Inside a group — repeater list:
╔══════════════════════════════════════════════════════╗
║ LISTING REPEATERS FROM GROUP 4 — Santa Catarina ║
╚══════════════════════════════════════════════════════╝
No | GROUP | REPEATER | CALLSIGN | MODE | FREQUENCY
════════════════════════════════════════════════════════
1 | Santa Catarina | Blumenau | PP5BLU B | DV | 439,950000
2 | Santa Catarina | Chapeco | PP5CHP | FM | 147,150000
...
Page 1 of 2 (18 items)
[N] Next pg | [P] Prev pg | [B] Back Groups | [X] Main Menu
>> Number to detail (or indicated key):
Detail view of a selected repeater:
╔══════════════════════════════════════════════════════╗
║ REPEATER DETAILS ║
╚══════════════════════════════════════════════════════╝
1. Group Number: 4
2. Group Name: Santa Catarina
3. Repeater Name: Blumenau
4. Sub Name: Sul
5. Callsign: PP5BLU B
6. Gateway Callsign: PP5BLU G
7. Frequency: 439,950000
8. Duplex (DUP): DUP-
9. Freq. Offset: 5,000000
10. Operation Mode: DV
11. TONE Type: OFF
12. Repeater Tone: 88,5Hz
13. USE (From): YES
14. Location: Approximate
15. Latitude: -26,919444
16. Longitude: -49,065556
17. UTC Offset: -3:00
[E] Edit | [D] Delete | [B] Back | [X] Main Menu
>> Option:
A guided sequential form that collects all 17 fields for a new entry. The group name is auto-filled if the group number already exists in the database. For FM/FM-N modes, a numbered CTCSS tone table is displayed during the Repeater Tone selection step.
Field entry flow for an analog repeater.
>> Group No (1-50) [X to cancel]: 28
>> Associated Group Name: HotSpots
>> Name [X to cancel]: Rep. FM Example
>> Sub Name [X to cancel]: Sub
Mode: 1) DV 2) FM 3) FM-N
>> Choose (1-3) [Enter keeps: FM | X to cancel]: 2
Dup: 1) OFF 2) DUP- 3) DUP+
>> Choose (1-3) [Enter keeps: OFF | X to cancel]: 2
>> Offset (ex: 5,000000) [Enter keeps: 0,000000 | X to cancel]: 5,000000
>> Frequency (ex: 439,975000) [X to cancel]: 439,800000
>> Repeater Call Sign (Optional) [X to cancel]: AB1CDE
TONE: 1) OFF 2) TONE 3) TSQL
>> Choose (1-3) [Enter keeps: OFF | X to cancel]: 3
--- STANDARD ICOM CTCSS TONE TABLE ---
1) 67,0 2) 69,3 3) 71,9 4) 74,4 5) 77,0 6) 79,7 7) 82,5
8) 85,4 9) 88,5 10) 91,5 11) 94,8 12) 97,4 13) 100,0 14) 103,5
15) 107,2 16) 110,9 17) 114,8 18) 118,8 19) 123,0 20) 127,3 21) 131,8
22) 136,5 23) 141,3 24) 146,2 25) 151,4 26) 156,7 27) 159,8 28) 162,2
29) 165,5 30) 167,9 31) 171,3 32) 173,8 33) 177,3 34) 179,9 35) 183,5
36) 186,2 37) 189,9 38) 192,8 39) 196,6 40) 199,5 41) 203,5 42) 206,5
43) 210,7 44) 218,1 45) 225,7 46) 229,1 47) 233,6 48) 241,8 49) 250,3
50) 254,1
>> Choose Repeater Tone (1-50) [X to cancel]: 30
RPT1USE: 1) YES 2) NO
>> Choose (1-2) [Enter keeps: YES | X to cancel]: 1
Position: 1) None 2) Approximate 3) Exact
>> Choose (1-3) [Enter keeps: None | X to cancel]: 3
>> Latitude (ex: -26,149167) [Enter keeps: 0,000000 | X to cancel]: -26,149167
>> Longitude (ex: -49,812167) [Enter keeps: 0,000000 | X to cancel]: -49,812167
>> UTC Offset (ex: -3:00) [Enter keeps: -3:00 | X to cancel]:-3:00
Field entry flow for a digital repeater.
>> Group No (1-50) [X to cancel]: 28
>> Associated Group Name: HotSpots
>> Name [X to cancel]: Rep. DV Example
>> Sub Name [X to cancel]: Sub
Mode: 1) DV 2) FM 3) FM-N
>> Choose (1-3) [Enter keeps: FM | X to cancel]: 1
Dup: 1) OFF 2) DUP- 3) DUP+
>> Choose (1-3) [Enter keeps: OFF | X to cancel]: 3
>> Offset (ex: 5,000000) [Enter keeps: 0,000000 | X to cancel]: 5,000000
>> Frequency (ex: 439,975000) [X to cancel]: 434,900000
>> Repeater Call Sign [X to cancel]: PP5PK C
>> Gateway Call Sign [Enter keeps: PP5PK G | X to cancel]:
RPT1USE: 1) YES 2) NO
>> Choose (1-2) [Enter keeps: YES | X to cancel]: 1
Position: 1) None 2) Approximate 3) Exact
>> Choose (1-3) [Enter keeps: None | X to cancel]: 3
>> Latitude (ex: -26,149167) [Enter keeps: 0,000000 | X to cancel]: -26,149167
>> Longitude (ex: -49,812167) [Enter keeps: 0,000000 | X to cancel]: -49,812167
>> UTC Offset (ex: -3:00) [Enter keeps: -3:00 | X to cancel]: -3:00
The same form is reused for editing an existing repeater (reached from Option 1 → detail view →
[E]), pre-populated with all current values.
╔══════════════════════════════════════════════════════╗
║ EDIT GROUPS ║
╚══════════════════════════════════════════════════════╝
1. Rename Group
2. Remove Group (Move linked repeaters)
X. Back
- Rename — updates the group name across every repeater entry that belongs to that group.
- Remove — offers two options: move all repeaters in the group to another group (existing or new), or delete all of them permanently. Both paths create an automatic
.backupfile before modifying the database.
Allows filtering the entire database using up to 3 combined criteria:
╔══════════════════════════════════════════════════════╗
║ QUERY DATABASE ║
╚══════════════════════════════════════════════════════╝
--- Filter 1 ---
1) Group 2) Mode 3) RPT1USE 4) Call Sign 5) Frequency
Choose the field by number (or [Enter] / X to cancel):
| Filter | Match type | Description |
|---|---|---|
| Group | Exact | Select from a numbered list of available groups |
| Mode | Exact | Choose DV, FM, or FM-N |
| RPT1USE | Exact | Choose YES or NO |
| Call Sign | Partial | Text search against the Repeater Call Sign field |
| Frequency | Partial | Text search against the Frequency field |
Results are sorted by group name then repeater name, displayed in a paginated table. Selecting an entry number opens the full detail view, from which the entry can also be edited or deleted directly.
[N] Next pg | [P] Prev pg | [S] New Search | [X] Main Menu
╔══════════════════════════════════════════════════════╗
║ MANAGE DATABASE ║
╚══════════════════════════════════════════════════════╝
Currently selected base: Repeater_list.csv
CSV standard: Separator [ ; ], Decimal [ , ]
1. Select Base CSV File
2. Import CSV
3. Export DR_list.csv (RptYYYYMMDD_XX.csv)
4. Validate Database
5. Delete Database
6. Clear Database (Keep header only)
X. Return
| Option | Description |
|---|---|
| 1 — Select CSV | Switch the active database file. Lists all .csv files in the current directory. Can create a new empty base on the fly. |
| 2 — Import CSV | Validate and import an external CSV. After validation, choose to Replace the current database or Append records to it. Group name conflicts between source and target are resolved interactively with [K]eep or [U]pdate options. |
| 3 — Export | Save a copy of the current database as RptYYYYMMDD_XX.csv, where XX is an auto-incrementing sequence number to avoid overwriting previous exports from the same day. |
| 4 — Validate | Run the full validation engine on the active database. Errors are shown line by line with the options to Correct interactively, Skip the offending line, or Abort the process. All automatic corrections are logged with details. |
| 5 — Delete | List all available CSV files (excluding the currently active base). Select one to delete with a double-confirmation prompt. Prevents accidental deletion of the working database. |
| 6 — Clear | Erase all records, retaining only the CSV header row. Requires explicit confirmation. Also removes backup files older than 7 days. |
| Field | Accepted values |
|---|---|
Group No |
Integer 1–50 |
Group Name |
Printable characters, max 16 chars |
Name |
Printable characters, max 16 chars |
Sub Name |
Printable characters, max 8 chars |
Repeater Call Sign |
Max 8 chars; DV requires exactly 8, last char A–Z; must be empty for simplex (Dup=OFF) |
Gateway Call Sign |
Exactly 8 chars, last char G, first 7 chars must match RPT1 call sign; required for DV duplex only |
Frequency |
Format NNN,NNNNNN; must fall within 144–148 MHz (VHF) or 430–450 MHz (UHF) |
Dup |
OFF, DUP-, DUP+ |
Offset |
Format N,NNNNNN; must be 0,000000 when Dup=OFF |
Mode |
DV, FM, FM-N |
TONE |
OFF, TONE, TSQL — FM/FM-N only; must be OFF for DV |
Repeater Tone |
Standard CTCSS value with Hz suffix (e.g. 88,5Hz); must be 88,5Hz for DV entries |
RPT1USE |
YES, NO |
Position |
None, Approximate, Exact |
Latitude |
Format -?NN,NNNNNN (e.g. -27,597222) |
Longitude |
Format -?NNN,NNNNNN (e.g. -48,549167) |
UTC Offset |
Format ±HH:MM or --:-- (e.g. -3:00) |
The following 50 standard ICOM tones are accepted (Hz, comma-decimal):
67,0 69,3 71,9 74,4 77,0 79,7 82,5
85,4 88,5 91,5 94,8 97,4 100,0 103,5
107,2 110,9 114,8 118,8 123,0 127,3 131,8
136,5 141,3 146,2 151,4 156,7 159,8 162,2
165,5 167,9 171,3 173,8 177,3 179,9 183,5
186,2 189,9 192,8 196,6 199,5 203,5 206,5
210,7 218,1 225,7 229,1 233,6 241,8 250,3 254,1
The validation engine (shared by both the manual add/edit form and the CSV import process) enforces the following rules:
- Frequency range — only VHF (144–148 MHz) and UHF (430–450 MHz) amateur bands are accepted.
- DV callsign exclusivity — a callsign used as a DV repeater cannot appear under any other mode in the database, and vice versa.
- FM/FM-N band exclusivity — the same callsign cannot serve as a repeater in the same band (VHF or UHF) more than once; dual-band operation with the same callsign requires separate entries on different bands.
- Duplicate entries — records sharing the same Group No + Name + Frequency combination are flagged as duplicates.
- Mode-field consistency — DV entries must have
TONE=OFFandRepeater Tone=88,5Hz; FM/FM-N entries must have a valid non-empty CTCSS tone. - Simplex entries — both
Repeater Call SignandGateway Call Signmust be empty whenDup=OFF. - Automatic silent corrections — the following are fixed without user interaction: period-based decimal separators (
.→,), missingHzsuffix on Repeater Tone values, and non-zero Offset values when Dup=OFF. All corrections are logged indr_manager.logwith line-by-line details.
- Cancel anywhere — press
Xat any prompt (including mid-form) to abort cleanly and return to the previous menu without saving partial data. - Accept defaults — press
Enterat any prompt to keep the value shown in orange brackets. - Automatic backup — a
.backupfile is created automatically before any destructive operation (delete repeater, remove group, switch database). - Export before bulk changes — use Option 5 → 3 to save a timestamped snapshot before making large edits.
- Locale in spreadsheet apps — when opening the CSV in LibreOffice Calc or Excel, configure the import dialog for
;as the column delimiter and,as the decimal separator to avoid data corruption. - ICOM programming software — import the exported CSV through the CS software (CS-51, CS-52, CS-5100, etc.) using the memory channel CSV import function.
- The
;character is forbidden in all text fields and will be rejected with an error at entry time. - Single instance — the script uses a PID lock file at
/tmp/dr_list_manager.lock. If a previous session crashed and left a stale lock, the script detects and removes it automatically on next launch. - Database deletion — use Option 5 → 5 to safely remove old or unused CSV files. The currently active database cannot be deleted; switch to another base first if needed.
All significant operations are appended to dr_manager.log in the script's working directory:
[2025-04-14 14:32:01] START: System started with base: Repeater_list.csv
[2025-04-14 14:33:45] ADD: New repeater 'Joinville' added to CSV
[2025-04-14 14:35:12] EDIT: Repeater 'Blumenau' updated in CSV (line 23)
[2025-04-14 14:38:00] RENAME_GROUP: Group 4 renamed from 'SC' to 'Santa Catarina'
[2025-04-14 14:40:00] EXPORT: Base exported as Rpt20250414_01.csv
[2025-04-14 14:41:15] DELETE_BASE: Database file deleted: old_rpt_list.csv
[2025-04-14 14:42:30] IMPORT_AUTO_CORRECTION_LINE_5: Group: 01 | Name: Rio Branco | Corrections: Frequency: converted decimal point to comma (146.520000 -> 146,520000). Repeater Tone: added Hz suffix (88,5 -> 88,5Hz).
[2025-04-14 14:43:45] END: System closed by user
Logged event types: START, END, ADD, EDIT, DELETE, DELETE_GROUP, DELETE_BASE, RENAME_GROUP, MOVE_GROUP, BASE_SELECT, IMPORT, EXPORT, CLEANUP, IMPORT_AUTO_CORRECTION_LINE_*, IMPORT_VALIDATION_IGNORED, IMPORT_VALIDATION_CORRECTED, IMPORT_VALIDATION_SUMMARY.
This project follows semantic versioning:
- Decimal increments (e.g.
3.6→3.7) — bug fixes, minor UX improvements, or small feature additions. - Whole-number increments (e.g.
3.x→4.0) — significant new features or structural changes. - Language suffix (e.g.
3.7_en) — indicates English localization version.
The current version (3.8_en) is displayed in the application header on every startup.
This project is released under the MIT License. See LICENSE for details.
Developed by Daniel — PP5KX
Amateur radio operator based in Mafra, Santa Catarina, Brazil
🌐 pp5kx.net · dvbr.net
Part of the dvbr.net open infrastructure project for the Brazilian amateur radio community.
73 de PP5KX