{"id":16914864,"url":"https://github.com/pzl/ciqdb","last_synced_at":"2026-03-11T14:37:36.343Z","repository":{"id":65854980,"uuid":"143558378","full_name":"pzl/ciqdb","owner":"pzl","description":"Connect IQ (PRG) parser and debugger","archived":false,"fork":false,"pushed_at":"2024-04-20T15:08:40.000Z","size":67,"stargazers_count":33,"open_issues_count":5,"forks_count":7,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-03T16:13:55.099Z","etag":null,"topics":["connectiq","go","golang","monkey-c"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pzl.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2018-08-04T19:43:58.000Z","updated_at":"2024-09-13T07:27:28.000Z","dependencies_parsed_at":"2024-06-20T18:54:01.780Z","dependency_job_id":"c623e78a-9d5b-4e9f-907c-c6b08284923a","html_url":"https://github.com/pzl/ciqdb","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pzl/ciqdb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pzl%2Fciqdb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pzl%2Fciqdb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pzl%2Fciqdb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pzl%2Fciqdb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pzl","download_url":"https://codeload.github.com/pzl/ciqdb/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pzl%2Fciqdb/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30384091,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T14:10:17.325Z","status":"ssl_error","status_checked_at":"2026-03-11T14:09:37.934Z","response_time":84,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["connectiq","go","golang","monkey-c"],"created_at":"2024-10-13T19:15:37.681Z","updated_at":"2026-03-11T14:37:36.312Z","avatar_url":"https://github.com/pzl.png","language":"Go","funding_links":[],"categories":["Tools"],"sub_categories":["Older resources"],"readme":"CIQDB\n=====\n\n**CIQDB** is the unofficial [**C**onnect **IQ**](https://developer.garmin.com/connect-iq/programmers-guide/) Debugger.\n\nIt takes an already-compiled `.prg` or `.iq` file, make with the Connect IQ SDK, and parses it. It provides any symbols, debug sections, and more pulled from the binary.\n\nCIQDB is written in Go, with no current dependencies. \n\nBuilding\n---------\n\nTo build, all you need is a Go compiler, and to run `go generate \u0026\u0026 go build`. A makefile is provided to simplify this to just `make`.\n\nUsage\n-----\n\n`ciqdb \u003cpath/to/file.prg\u003e`. There are no flags or other arguments, currently. Just pass in the path to a compiled CIQ program.\n\nThe following is example output, when compiling [crystal-face](https://github.com/warmsound/crystal-face) with CIQ SDK 3.0.0-beta1. Some sections are trimmed for length\n\n```\n$ ./ciqdb crystal-face.prg\nd000d000 - Head (13 bytes)\n    CIQ version: 3.0.0\n    App Trial Enabled: false\n6060c0de - Entry Points (38 bytes)\n  Entry Point 0\n    UUID: bde5c058244911e8b4670ed5f89f718b\n    Type: WatchFace\n    AppName: CrystalApp\n    Module: globals\n    icon: f8\nda7ababe - Data (5186 bytes)\n    extends Offset: 0\n    static Entry: 0\n    parent module: Unknown Symbol ID: 0\n    module ID: statics\n    app types: 3f\n    fields:\n        globals_Rez: 564  ModuleDef\n        globals_Rez_Drawables: 643  ModuleDef\n        globals_Rez_Menus: 682  ModuleDef\n        globals_Rez_Fonts: 713  ModuleDef\n        globals_Rez_JsonData: 808  ModuleDef\n        globals_Rez_Layouts: 839  ModuleDef\n        globals_Rez_Strings: 878  ModuleDef\n        LeftGoalCurrent: 87  ModuleDef\n    extends Offset: 0\n    static Entry: 0\n    parent module: Unknown Symbol ID: 0\n    module ID: globals\n    app types: 3f\n    fields:\n        GoalMeter: 1907 const  ClassDefinition\n        DateLine: 1780 const  ClassDefinition\n        MoveBar: 2289 const  ClassDefinition\n        CrystalApp: 2170 const  ClassDefinition\n        DEFAULT_PARAMS: 0  Null\n        testGetSegmentScale: 268444038 const  Method\n        testGetSegments: 268444150 const  Method\n        ThickThinTime: 357 const  ClassDefinition\n        CrystalView: 1405 const  ClassDefinition\n        GoalMeterMask: 294 const  ClassDefinition\n        globals_Rez_Drawables: 0  Null\n        \u003cglobals_ThickThinTime_\u003c\u003emSecondsFont\u003e: 268454218 hidden  Method\n        \u003cglobals_ThickThinTime_\u003c\u003emSecondsFont\u003e: 268454218 hidden  Method\n... //SNIP\n\nc0debabe - Code (20531 bytes)\nc0de7ab1 - Code Table (aka PCtoLineNum) (12642 bytes)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:35 initialize (pc 268435456)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:36 initialize (pc 268435460)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:38 initialize (pc 268435480)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:39 initialize (pc 268435496)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:40 initialize (pc 268435512)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:41 initialize (pc 268435528)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:42 initialize (pc 268435544)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:44 initialize (pc 268435560)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:47 getWidth (pc 268435580)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:48 getWidth (pc 268435584)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:50 getWidth (pc 268435584)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:51 getWidth (pc 268435584)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:53 getWidth (pc 268435584)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:54 getWidth (pc 268435601)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:55 getWidth (pc 268435630)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:56 getWidth (pc 268435643)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:57 getWidth (pc 268435726)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:59 getWidth (pc 268435750)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:62 getWidth (pc 268435760)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:65 setValues (pc 268435764)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:70 setValues (pc 268435768)\n    /home/dan/dev/MonkeyC/samples/crystal-face/source/GoalMeter.mc:71 setValues (pc 268435782)\n... //SNIP\n\nc1a557b1 - Class Table (class imports) (1770 bytes)\n    module: Toybox_Test, class: Logger\n    module: Toybox_Test, class: AssertException\n    module: Toybox_Test, class: Test\n    module: Toybox_System, class: Stats\n    module: Toybox_System, class: DeviceSettings\n    module: Toybox_System, class: Intent\n    module: Toybox_System, class: ClockTime\n    module: Toybox_System, class: PreviousOperationNotCompleteException\n    module: Toybox_System, class: ConnectionInfo\n    module: Toybox_System, class: ServiceDelegate\n    module: Toybox_System, class: AppNotInstalledException\n    module: Toybox_System, class: UnexpectedAppTypeException\n    module: Toybox_SensorHistory, class: SensorHistoryIterator\n    module: Toybox_SensorHistory, class: SensorSample\n    module: Toybox_Activity, class: Info\n    module: Toybox_PersistedContent, class: Waypoint\n    module: Toybox_PersistedContent, class: Iterator\n    module: Toybox_PersistedContent, class: Track\n    module: Toybox_PersistedContent, class: Workout\n... //SNIP\n\nf00d600d - Resources (25199 bytes)\n6000db01 - Permissions (10 bytes)\n    Toybox_SensorHistory\n    Toybox_UserProfile\n\n0ece7105 - Exceptions (2 bytes)\n\n5717b015 - Symbols (60133 bytes)\n    236: LeftFieldIcon\n    8388920: Moment\n    8389131: setColor\n    8389245: deviceType\n    8388718: error\n    8388831: SPORT_RUNNING\n    8389539: mInitialText\n    8390196: TimerRunMultiple\n    8390666: BikeSpeedCadence\n    8388850: SUB_SPORT_GENERIC\n    8389586: TooManyEventsException\n    8389308: toRadians\n    8390022: restoreHeadlightsNetworkModeControl\n... //SNIP\n\n5e771465 - Settings (563 bytes)\n    HoursColourOverride: 4294967295\n    AlwaysShowMoveBar: false\n    HideSeconds: true\n    Theme: 0\n    RightGoalType: 1\n    ThemeColour: 43775\n    AppVersion: 1.6.0\n    LeftFieldType: 0\n    RightFieldType: 2\n    MinutesColourOverride: 4294967295\n    MonoDarkColour: 11184810\n    BackgroundColour: 0\n    CaloriesGoal: 2000\n    MonoLightColour: 16777215\n    MinutesColour: 43775\n    HideHoursLeadingZero: true\n    LeftGoalType: 0\n    MeterBackgroundColour: 5592405\n    HoursColour: 43775\n    CenterFieldType: 1\n\ne1c0de12 - Developer Signature (1028 bytes)\n    signature: 8adb0475cd0dc282ec27...\n    modulus: c1c90eeff1c61957e2c3...\n    exponent: 65537\n00000000 - End (0 bytes)\n\n```\n\n\nFuture\n-------\n\nCurrently, CIQDB is just able to print information about _most_ of a PRG's file's information. There are still some sections being reverse-engineered (code and resources).\n\nFuture plans for this project are to completely parse all prg sections, and act as an interactive debugger, similar to `gdb`. CIQDB will tap into the existing Connect IQ simulator, and the integrated debugger that ships the the SDK. It will pass breakpoint/continue/etc commands through to the simulator. But through parsing the prg, it should be able to have much richer information and display.\n\nLicense\n-------\n\nThis code is licensed under the MIT License, Copyright 2018 Dan Panzarella. See the `LICENSE` file for full license.\n\n---\n\nThis repository and code are not affiliated with or supported by Garmin in any way. Connect IQ name and title is owned by Garmin Ltd. and its subsidiaries.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpzl%2Fciqdb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpzl%2Fciqdb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpzl%2Fciqdb/lists"}