# FreeDMR 2 Subscription Model The subscription model is the centrepiece of FreeDMR 2. Conceptually, each TG is a conference bridge. Client systems subscribe to conference TGs. FreeDMR routes traffic according to active subscriptions, not according to the legacy shape of the `BRIDGES` dict. Definitions: - `conference_tg`: FreeDMR network/conference identity. - `rf_tg`: Client-facing RF presentation identity. Examples: Direct TG: ```text rf_tg == conference_tg ``` Dial-a-TG: ```text rf_tg == 9 conference_tg == selected reflector/TG ``` Alias/rewrite: ```text rf_tg may differ from conference_tg by policy/configuration ``` Example subscription: ```python TalkgroupSubscription( client_id=2345001, slot=2, rf_tg=9, conference_tg=4400, mode="dial", active=True, ) ``` ## Routing Invariant Packet routing should not need to know whether a subscription came from static config, default reflector, dial-a-TG, API, SMS control, or a future UI action. Those are subscription sources, not routing modes. ## Dial-a-TG Rationale Dial-a-TG exists so terminal users can access arbitrary FreeDMR TGs without programming every TG into the terminal/codeplug. It is an amateur-radio usability feature and should be evaluated against that goal, not only against commercial DMR fleet assumptions. Control of dial-a-TG from TS1 as well as TS2 is intentional. If TS2 is blocked by unwanted traffic, a user can transmit private-call control on TS1 to disconnect or change the TS2 reflector/TG state. Voice prompts should remain RF-visible as TG9 slot 2 unless that policy is deliberately changed. ## FreeDMR Routing Model - TGs are conference groups. - DMR IDs are like phone numbers. - Timeslots are access/capacity paths, more like phone lines. - FreeDMR is intended to be relatively timeslot agnostic. - TS1 control affecting TS2 reflector state is consistent with the FreeDMR PBX/line model. This model also allows future arbitrary RF TG aliases, not only the traditional TG9 dial-a-TG rewrite.