{"id":28331987,"url":"https://github.com/joergschultzelutter/core-aprs-client","last_synced_at":"2026-06-12T06:06:11.666Z","repository":{"id":291636920,"uuid":"937570690","full_name":"joergschultzelutter/core-aprs-client","owner":"joergschultzelutter","description":"Extensible and user-friendly APRS bot framework with dupe detection, beacon/bulletin support and other nice features. Just add your custom APRS bot functions - the `core-aprs-client` framework will take care of the rest.","archived":false,"fork":false,"pushed_at":"2026-03-03T08:06:35.000Z","size":2339,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-03T08:36:46.957Z","etag":null,"topics":["amateur-radio","amateurradio","aprs","aprs-daemon","aprs-is","framework","ham-radio","hamradio"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/joergschultzelutter.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-23T11:47:48.000Z","updated_at":"2026-01-23T21:34:38.000Z","dependencies_parsed_at":"2025-06-12T20:51:33.627Z","dependency_job_id":"9be646c7-f87a-4df5-a46e-ebe9e834d1cc","html_url":"https://github.com/joergschultzelutter/core-aprs-client","commit_stats":null,"previous_names":["joergschultzelutter/core-aprs-client"],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/joergschultzelutter/core-aprs-client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joergschultzelutter%2Fcore-aprs-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joergschultzelutter%2Fcore-aprs-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joergschultzelutter%2Fcore-aprs-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joergschultzelutter%2Fcore-aprs-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joergschultzelutter","download_url":"https://codeload.github.com/joergschultzelutter/core-aprs-client/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joergschultzelutter%2Fcore-aprs-client/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34231243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amateur-radio","amateurradio","aprs","aprs-daemon","aprs-is","framework","ham-radio","hamradio"],"created_at":"2025-05-26T19:22:45.638Z","updated_at":"2026-06-12T06:06:11.662Z","avatar_url":"https://github.com/joergschultzelutter.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# core-aprs-client\r\n\r\n![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg) [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![PyPi version](https://img.shields.io/pypi/v/core-aprs-client.svg)](https://pypi.python.org/pypi/core-aprs-client)\r\n\r\n\r\n## Table of contents\r\n\u003c!--ts--\u003e\r\n\r\n* [Introduction](#introduction)\r\n* [Sample APRS Client](#sample-aprs-client)\r\n* [Core features](#core-features)\r\n* [Installation and Configuration](#installation-and-configuration)\r\n  * [Installation instructions](#installation-instructions)\r\n  * [Client Configuration](#client-configuration)\r\n  * [Framework examples](#framework-examples)\r\n  * [`CoreAprsClient` class description](#coreaprsclient-class-description)\r\n  * [Source Code Anatomy](#source-code-anatomy)\r\n  * [Framework usage](#framework-usage)\r\n  * [Client schematics](#client-schematics)\r\n* [Known issues and caveats](#known-issues-and-caveats)\r\n* [Projects that use `core-aprs-client`](#projects-that-use-core-aprs-client)\r\n* [Known issues and caveats](#known-issues-and-caveats)\r\n* [Alternatives to `core-aprs-client`](#alternatives-to-core-aprs-client)\r\n* [The fine print](#the-fine-print)\r\n\r\n\u003c!--te--\u003e\r\n\r\n## Introduction\r\n\r\nCore APRS client framework with dupe detection, bulletin/beaconing support, and other APRS-IS related stuff.\r\n\r\n```core-aprs-client``` is a modernized version of [mpad](https://github.com/joergschultzelutter/mpad)'s APRS functions which can be used for building your very own APRS client / bot. Its framework supports all of [mpad](https://github.com/joergschultzelutter/mpad)'s core APRS messaging functions, such as connecting to APRS-IS, message dupe detection, ACK handling, and other functionality such as APRS bulletins (supporting both static and dynamic contents) and APRS beaconing. Additionally, support for rare use cases such as [pre- and post-processing](/docs/framework_usage.md#extending-the-pre-processor-pre_processorpy) of APRS requests is provided. However, ```core-aprs-client``` deliberately lacks any _specific_ APRS bot functions such as WX reporting etc. \r\n\r\nThis is where _you_ step in. Add your bot-specific code to the client's APRS framework code. Everything else related to APRS messaging and communication with APRS-IS will be covered by the ```core-aprs-client``` framework.\r\n\r\n## Sample APRS Client\r\n\r\nThe following example illustrates a fully functional APRS bot. You will provide the APRS message input parser code and the generator responsible for the outgoing APRS message content. Everything else will be handled by the `core-aprs-client` framework.\r\n\r\n```python\r\nfrom CoreAprsClient import CoreAprsClient\r\n\r\n# Your custom input parser and output generator code\r\nfrom input_parser import parse_input_message\r\nfrom output_generator import generate_output_message\r\n\r\nimport logging\r\n\r\nif __name__ == '__main__':\r\n    client = CoreAprsClient(config_file=\"core_aprs_client.cfg\",\r\n                            log_level=logging.INFO,\r\n                            input_parser=parse_input_message,\r\n                            output_generator=generate_output_message)\r\n    client.activate_client()\r\n```\r\n\r\nIt's as simple as that.\r\n\r\n## Core features\r\n- Core APRS-IS functionality, covering both 'old' and '[new](http://www.aprs.org/aprs11/replyacks.txt)' ACK processing\r\n- Configurable dupe message handler\r\n- Optional:\r\n    - APRS beacons and bulletins, including [support for dynamic bulletin content](/docs/coreaprsclient_class.md#use-of-dynamic-content-for-aprs-bulletins-additional-to-static-bulletin-content) generated during runtime\r\n    - Program [crash handler](/docs/configuration_subsections/config_crash_handler.md), allowing you to get notified in case the client program crashes\r\n    - Support for [pre- and post-processing](/docs/framework_usage.md#extending-the-optional-code-stubs)\r\n- All configuration settings are stored in a single [program configuration file](/docs/configuration.md#program-configuration-file)\r\n\r\n## Installation and Configuration\r\n\r\n### Installation instructions\r\nInstructions for installing the framework and its sample APRS client on your computer can be found [here](docs/installation.md).\r\n\r\n### Client Configuration\r\nThe steps for modifying the client's config file are described [here](docs/configuration.md).\r\n\r\n### Framework examples \r\n[This directory](framework_examples/README.md) contains sample program code; it also contains the ready-to-use templates for the framework's configuration files.\r\n\r\n### `CoreAprsClient` class description\r\nThe framework's class methods are described [here](docs/coreaprsclient_class.md)\r\n\r\n### Source Code Anatomy\r\nA brief overview on this repositories' software modules used by the client can be found [here](docs/anatomy.md).\r\n\r\n### Framework usage\r\nThe steps for using the client framework are described [here](docs/framework_usage.md).\r\n\r\n### Client schematics\r\nIf you want to learn about the bot's basic processing structure, then have a look at [this diagram](docs/schematics.md).\r\n\r\n### Projects that use `core-aprs-client`\r\nA list of my projects that are dependent on `core-aprs-client` can be found [here](/docs/projectsusingcoac.md)\r\n\r\n## Known issues and caveats\r\n- This software is single-threaded. Due to APRS-IS's technical nature of resubmitting non-ack'ed messages, this limitation should not be an issue, though. Future versions of this software might support queued processing of incoming requests.\r\n- This software is intended to be used by licensed ham radio operators. If you are not a licensed ham radio operator, then this program is not (yet) for you. Why not take a look at sites such as [Hamstudy](https://hamstudy.org/) and [50 Ohm](https://50ohm.de/) - and get licensed?\r\n- You should at least know the APRS basics before you use this software. Acquaint yourself with [the official APRS documentation](https://github.com/wb2osz/aprsspec) and learn about [how APRS works](https://how.aprs.works/) in general. Additionally, have a look at the [APRS Foundation](https://www.aprsfoundation.org/)'s website.\r\n- You HAVE to assign your personal call sign to the bot.\r\n- You HAVE to [request your personal APRS TOCALL](https://github.com/aprsorg/aprs-deviceid) for using this bot __in production__. See the [APRS Device ID](https://github.com/aprsorg/aprs-deviceid/blob/main/ALLOCATING.md#development-phase) information section on proper usage.\r\n\r\n## Alternatives to `core-aprs-client`\r\nA great alternative to `core-aprs-client` is KM6LYW's[`aprsd`](https://github.com/craigerl/aprsd). If you don't intend to use `core-aprs-client`'s specific functionalities such as pre- and post-processing (which afaik aren't supported by `aprsd`), this program might be a viable alternative.\r\n\r\n## The fine print\r\n\r\n- If you intend to host an instance of this program, you must be a licensed radio amateur. BYOP: Bring your own (APRS-IS) passcode. If you don't know what this is, then this program is not for you.\r\n\r\n- APRS is a registered trademark of APRS Software and Bob Bruninga, WB4APR.\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoergschultzelutter%2Fcore-aprs-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoergschultzelutter%2Fcore-aprs-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoergschultzelutter%2Fcore-aprs-client/lists"}