{
  "_id": "6a3654c43efcd9bda440190d",
  "Package": "mx.client",
  "Type": "Package",
  "Title": "Stateful Matrix Client Helpers",
  "Version": "0.1.1",
  "Date": "2026-06-13",
  "Authors@R": "c(\nperson(\"Troy\", \"Hernandez\", role = c(\"aut\", \"cre\"),\nemail = \"troy@cornball.ai\",\ncomment = c(ORCID = \"0009-0005-4248-604X\")),\nperson(\"cornball.ai\", role = \"cph\"))",
  "Description": "Stateful helpers for building 'Matrix'\n(<https://matrix.org>) chat clients in R. Builds on the\nlow-level 'mx.api' Client-Server API bindings, adding local\nconfiguration persistence, room resolution, sync cursor\nhandling, sync-event extraction, invite acceptance, a\nconservative Markdown-to-HTML converter for formatted messages,\nand 'Olm'/'Megolm' end-to-end encryption orchestration over the\noptional 'mx.crypto' package.",
  "License": "Apache License (>= 2)",
  "URL": "https://github.com/cornball-ai/mx.client",
  "BugReports": "https://github.com/cornball-ai/mx.client/issues",
  "VignetteBuilder": "simplermarkdown",
  "Encoding": "UTF-8",
  "Config/pak/sysreqs": "libssl-dev",
  "Repository": "https://cornball-ai.r-universe.dev",
  "Date/Publication": "2026-06-13 13:37:34 UTC",
  "RemoteUrl": "https://github.com/cornball-ai/mx.client",
  "RemoteRef": "HEAD",
  "RemoteSha": "3b6618ec3adddbcbb1b9d881fa581a84aa401f69",
  "NeedsCompilation": "no",
  "Packaged": {
    "Date": "2026-06-20 08:50:04 UTC",
    "User": "root"
  },
  "Author": "Troy Hernandez [aut, cre] (ORCID:\n<https://orcid.org/0009-0005-4248-604X>),\ncornball.ai [cph]",
  "Maintainer": "Troy Hernandez <troy@cornball.ai>",
  "MD5sum": "faf11e07ed9ca650cb066bbc1805e20c",
  "_user": "cornball-ai",
  "_type": "src",
  "_file": "mx.client_0.1.1.tar.gz",
  "_fileid": "a40415b8333c44b07ab6b0acee05c452531f873eab6a701b93df23d51b2419d0",
  "_filesize": 201137,
  "_sha256": "a40415b8333c44b07ab6b0acee05c452531f873eab6a701b93df23d51b2419d0",
  "_created": "2026-06-20T08:50:04.000Z",
  "_published": "2026-06-20T08:52:20.657Z",
  "_distro": "noble",
  "_jobs": [
    {
      "job": 82470430919,
      "time": 101,
      "config": "linux-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "7763843720"
    },
    {
      "job": 82470430920,
      "time": 101,
      "config": "linux-release-x86_64",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7763843661"
    },
    {
      "job": 82470430926,
      "time": 66,
      "config": "macos-oldrel-arm64",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "7763839771"
    },
    {
      "job": 82470430912,
      "time": 69,
      "config": "macos-release-arm64",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7763840052"
    },
    {
      "job": 82470277882,
      "time": 157,
      "config": "source",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7763831922"
    },
    {
      "job": 82470430909,
      "time": 92,
      "config": "wasm-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7763842553"
    },
    {
      "job": 82470430943,
      "time": 64,
      "config": "windows-devel",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "7763839732"
    },
    {
      "job": 82470430948,
      "time": 70,
      "config": "windows-oldrel",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "7763840122"
    },
    {
      "job": 82470430944,
      "time": 62,
      "config": "windows-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7763839273"
    }
  ],
  "_buildurl": "https://github.com/r-universe/cornball-ai/actions/runs/27866069871",
  "_status": "success",
  "_host": "GitHub-Actions",
  "_upstream": "https://github.com/cornball-ai/mx.client",
  "_commit": {
    "id": "3b6618ec3adddbcbb1b9d881fa581a84aa401f69",
    "author": "Troy Hernandez <troy@cornball.ai>",
    "committer": "GitHub <noreply@github.com>",
    "message": "Release 0.1.1 (#8)\n\n* Release 0.1.1\n\n* Keep reaction emoji out of the PDF manual\n\nwin-builder's PDF manual build (R CMD check --as-cran) errored: LaTeX\ncan't typeset the astral-plane emoji (thumbs-up/down, check/cross) that\nmx_extract_reaction_verdict carried as literal glyphs in its signature\ndefaults, which landed verbatim in the .Rd \\usage block. Local check\nruns --no-manual, so it never surfaced.\n\nDefaults are now NULL sentinels resolved inside the function via\nintToUtf8(); the \\usage block is ASCII, the manual builds, and the\ndefault approve/deny keys are unchanged.",
    "time": 1781357854
  },
  "_maintainer": {
    "name": "Troy Hernandez",
    "email": "troy@cornball.ai",
    "login": "troyhernandez",
    "description": "",
    "uuid": 5670773
  },
  "_registered": true,
  "_dependencies": [
    {
      "package": "R",
      "version": ">= 4.0",
      "role": "Depends"
    },
    {
      "package": "jsonlite",
      "role": "Imports"
    },
    {
      "package": "mx.api",
      "version": ">= 0.3.0",
      "role": "Imports"
    },
    {
      "package": "stats",
      "role": "Imports"
    },
    {
      "package": "tools",
      "role": "Imports"
    },
    {
      "package": "utils",
      "role": "Imports"
    },
    {
      "package": "mx.crypto",
      "role": "Suggests"
    },
    {
      "package": "simplermarkdown",
      "role": "Suggests"
    },
    {
      "package": "tinytest",
      "role": "Suggests"
    }
  ],
  "_owner": "cornball-ai",
  "_selfowned": true,
  "_usedby": 0,
  "_updates": [
    {
      "week": "2026-20",
      "n": 1
    },
    {
      "week": "2026-24",
      "n": 9
    }
  ],
  "_tags": [],
  "_stars": 0,
  "_contributors": [
    {
      "user": "troyhernandez",
      "count": 10,
      "uuid": 5670773
    }
  ],
  "_userbio": {
    "uuid": 153995987,
    "type": "organization",
    "name": "cornball.ai",
    "followers": 13
  },
  "_downloads": {
    "count": 0,
    "source": "https://cranlogs.r-pkg.org/downloads/total/last-month/mx.client"
  },
  "_devurl": "https://github.com/cornball-ai/mx.client",
  "_searchresults": 0,
  "_rbuild": "4.6.0",
  "_assets": [
    "extra/citation.cff",
    "extra/citation.html",
    "extra/citation.json",
    "extra/citation.txt",
    "extra/contents.json",
    "extra/mx.client.html",
    "extra/NEWS.html",
    "extra/NEWS.txt",
    "extra/readme.html",
    "extra/readme.md",
    "manual.pdf"
  ],
  "_homeurl": "https://github.com/cornball-ai/mx.client",
  "_realowner": "cornball-ai",
  "_cranurl": true,
  "_releases": [
    {
      "version": "0.1.1",
      "date": "2026-06-19"
    }
  ],
  "_exports": [
    "mx_accept_invites",
    "mx_client_config_path",
    "mx_client_configure",
    "mx_client_from_config",
    "mx_client_legacy_config_path",
    "mx_client_load",
    "mx_client_relogin",
    "mx_client_save",
    "mx_client_session",
    "mx_crypto_account",
    "mx_crypto_account_save",
    "mx_crypto_claim_otks",
    "mx_crypto_decrypt_event",
    "mx_crypto_device_keys",
    "mx_crypto_encrypt_event",
    "mx_crypto_encrypt_for_devices",
    "mx_crypto_handle_to_device",
    "mx_crypto_inbound_session",
    "mx_crypto_known_devices",
    "mx_crypto_process_sync",
    "mx_crypto_publish_keys",
    "mx_crypto_room_key_payload",
    "mx_crypto_sessions_load",
    "mx_crypto_sessions_new",
    "mx_crypto_sessions_save",
    "mx_crypto_store_dir",
    "mx_extract_invites",
    "mx_extract_reaction_verdict",
    "mx_extract_text_events",
    "mx_markdown_to_html",
    "mx_pill_mentions",
    "mx_resolve_room",
    "mx_room_encrypted",
    "mx_room_lookup_by_name",
    "mx_send_encrypted",
    "mx_send_media",
    "mx_send_text",
    "mx_sync_update",
    "mx_with_relogin"
  ],
  "_help": [
    {
      "page": "mx.client-package",
      "title": "Stateful Matrix Client Helpers",
      "topics": [
        "mx.client-package",
        "mx.client"
      ]
    },
    {
      "page": "mx_accept_invites",
      "title": "Accept pending Matrix room invites",
      "topics": [
        "mx_accept_invites"
      ]
    },
    {
      "page": "mx_client_config_path",
      "title": "Path to a Matrix client config file",
      "topics": [
        "mx_client_config_path"
      ]
    },
    {
      "page": "mx_client_configure",
      "title": "Configure and save a Matrix client",
      "topics": [
        "mx_client_configure"
      ]
    },
    {
      "page": "mx_client_from_config",
      "title": "Wrap a list as an mx.client config",
      "topics": [
        "mx_client_from_config"
      ]
    },
    {
      "page": "mx_client_legacy_config_path",
      "title": "Legacy Matrix config path for an application",
      "topics": [
        "mx_client_legacy_config_path"
      ]
    },
    {
      "page": "mx_client_load",
      "title": "Load a Matrix client config",
      "topics": [
        "mx_client_load"
      ]
    },
    {
      "page": "mx_client_relogin",
      "title": "Re-login with stored credentials and refresh the saved token",
      "topics": [
        "mx_client_relogin"
      ]
    },
    {
      "page": "mx_client_save",
      "title": "Save a Matrix client config",
      "topics": [
        "mx_client_save"
      ]
    },
    {
      "page": "mx_client_session",
      "title": "Build an mx.api session from a client config",
      "topics": [
        "mx_client_session"
      ]
    },
    {
      "page": "mx_crypto_account",
      "title": "Load or create this client's Olm account",
      "topics": [
        "mx_crypto_account"
      ]
    },
    {
      "page": "mx_crypto_account_save",
      "title": "Persist an Olm account to the store",
      "topics": [
        "mx_crypto_account_save"
      ]
    },
    {
      "page": "mx_crypto_claim_otks",
      "title": "Claim a one-time key for each device",
      "topics": [
        "mx_crypto_claim_otks"
      ]
    },
    {
      "page": "mx_crypto_decrypt_event",
      "title": "Decrypt an m.room.encrypted event (Megolm)",
      "topics": [
        "mx_crypto_decrypt_event"
      ]
    },
    {
      "page": "mx_crypto_device_keys",
      "title": "Build a signed device_keys object for upload",
      "topics": [
        "mx_crypto_device_keys"
      ]
    },
    {
      "page": "mx_crypto_encrypt_event",
      "title": "Encrypt event content for a room (Megolm)",
      "topics": [
        "mx_crypto_encrypt_event"
      ]
    },
    {
      "page": "mx_crypto_encrypt_for_devices",
      "title": "Encrypt an event for an encrypted room's devices",
      "topics": [
        "mx_crypto_encrypt_for_devices"
      ]
    },
    {
      "page": "mx_crypto_handle_to_device",
      "title": "Decrypt an inbound Olm to-device payload",
      "topics": [
        "mx_crypto_handle_to_device"
      ]
    },
    {
      "page": "mx_crypto_inbound_session",
      "title": "Build an inbound Megolm session from a shared room key",
      "topics": [
        "mx_crypto_inbound_session"
      ]
    },
    {
      "page": "mx_crypto_known_devices",
      "title": "List the devices (and identity keys) of some users",
      "topics": [
        "mx_crypto_known_devices"
      ]
    },
    {
      "page": "mx_crypto_process_sync",
      "title": "Process a sync response: store room keys, decrypt room events",
      "topics": [
        "mx_crypto_process_sync"
      ]
    },
    {
      "page": "mx_crypto_publish_keys",
      "title": "Publish this device's identity and one-time keys",
      "topics": [
        "mx_crypto_publish_keys"
      ]
    },
    {
      "page": "mx_crypto_room_key_payload",
      "title": "Encrypt a Megolm room key to one device as a to-device payload",
      "topics": [
        "mx_crypto_room_key_payload"
      ]
    },
    {
      "page": "mx_crypto_sessions_load",
      "title": "Load a session set from the crypto store",
      "topics": [
        "mx_crypto_sessions_load"
      ]
    },
    {
      "page": "mx_crypto_sessions_new",
      "title": "Create an empty E2EE session set",
      "topics": [
        "mx_crypto_sessions_new"
      ]
    },
    {
      "page": "mx_crypto_sessions_save",
      "title": "Persist a session set to the crypto store",
      "topics": [
        "mx_crypto_sessions_save"
      ]
    },
    {
      "page": "mx_crypto_store_dir",
      "title": "Directory holding this client's encryption state",
      "topics": [
        "mx_crypto_store_dir"
      ]
    },
    {
      "page": "mx_extract_invites",
      "title": "Extract pending invite room ids from a sync response",
      "topics": [
        "mx_extract_invites"
      ]
    },
    {
      "page": "mx_extract_reaction_verdict",
      "title": "Extract a reaction approval verdict from sync events",
      "topics": [
        "mx_extract_reaction_verdict"
      ]
    },
    {
      "page": "mx_extract_text_events",
      "title": "Extract text message events from a sync response",
      "topics": [
        "mx_extract_text_events"
      ]
    },
    {
      "page": "mx_markdown_to_html",
      "title": "Convert a conservative markdown subset to Matrix custom HTML",
      "topics": [
        "mx_markdown_to_html"
      ]
    },
    {
      "page": "mx_pill_mentions",
      "title": "Turn textual @mentions into matrix.to pills",
      "topics": [
        "mx_pill_mentions"
      ]
    },
    {
      "page": "mx_resolve_room",
      "title": "Resolve a room id, name, or default room",
      "topics": [
        "mx_resolve_room"
      ]
    },
    {
      "page": "mx_room_encrypted",
      "title": "Is a room end-to-end encrypted?",
      "topics": [
        "mx_room_encrypted"
      ]
    },
    {
      "page": "mx_room_lookup_by_name",
      "title": "Look up a joined room by display name",
      "topics": [
        "mx_room_lookup_by_name"
      ]
    },
    {
      "page": "mx_send_encrypted",
      "title": "Send an end-to-end encrypted message to a room",
      "topics": [
        "mx_send_encrypted"
      ]
    },
    {
      "page": "mx_send_media",
      "title": "Send a media file to a Matrix room",
      "topics": [
        "mx_send_media"
      ]
    },
    {
      "page": "mx_send_text",
      "title": "Send plain text to a Matrix room",
      "topics": [
        "mx_send_text"
      ]
    },
    {
      "page": "mx_sync_update",
      "title": "Sync once and update the stored cursor",
      "topics": [
        "mx_sync_update"
      ]
    },
    {
      "page": "mx_with_relogin",
      "title": "Run a client operation, re-logging in once on an expired token",
      "topics": [
        "mx_with_relogin"
      ]
    }
  ],
  "_readme": "https://github.com/cornball-ai/mx.client/raw/HEAD/README.md",
  "_rundeps": [
    "curl",
    "jsonlite",
    "mx.api"
  ],
  "_vignettes": [
    {
      "source": "e2ee.md",
      "filename": "e2ee.html",
      "title": "End-to-end encryption",
      "engine": "simplermarkdown::mdweave_to_html",
      "headings": [
        "title: \"End-to-end encryption\"",
        "End-to-end encryption",
        "Security model",
        "The pieces",
        "Setup: a device with published keys",
        "Sending",
        "Receiving",
        "Persistence",
        "Marking a room encrypted"
      ],
      "created": "2026-06-10 15:27:02",
      "modified": "2026-06-10 15:27:02",
      "commits": 1
    }
  ],
  "_score": 4,
  "_indexed": true,
  "_nocasepkg": "mx.client",
  "_universes": [
    "cornball-ai",
    "troyhernandez"
  ],
  "_binaries": [
    {
      "r": "4.7.0",
      "os": "linux",
      "version": "0.1.1",
      "date": "2026-06-20T08:51:51.000Z",
      "distro": "noble",
      "commit": "3b6618ec3adddbcbb1b9d881fa581a84aa401f69",
      "fileid": "8d01107deb7b06b30d704d08be232eb732f2d2f513860391e1a8618a35522f41",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cornball-ai/actions/runs/27866069871"
    },
    {
      "r": "4.6.0",
      "os": "linux",
      "version": "0.1.1",
      "date": "2026-06-20T08:51:51.000Z",
      "distro": "noble",
      "commit": "3b6618ec3adddbcbb1b9d881fa581a84aa401f69",
      "fileid": "3e1c41b807d2bfcf0bcd615aa1741fc17250e87648f5f27be57129cd7dab89e1",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cornball-ai/actions/runs/27866069871"
    },
    {
      "r": "4.5.3",
      "os": "mac",
      "version": "0.1.1",
      "date": "2026-06-20T08:51:19.000Z",
      "commit": "3b6618ec3adddbcbb1b9d881fa581a84aa401f69",
      "fileid": "a593fd82482b3bf9cd224aa8b6a92da1f84b130d7db460135844c13bd035d86c",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cornball-ai/actions/runs/27866069871"
    },
    {
      "r": "4.6.0",
      "os": "mac",
      "version": "0.1.1",
      "date": "2026-06-20T08:51:21.000Z",
      "commit": "3b6618ec3adddbcbb1b9d881fa581a84aa401f69",
      "fileid": "bac90790c603a3fac045c7d19d00086d7e01047671cbaacdc7475aeb66859c43",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cornball-ai/actions/runs/27866069871"
    },
    {
      "r": "4.6.0",
      "os": "wasm",
      "version": "0.1.1",
      "date": "2026-06-20T08:51:51.000Z",
      "commit": "3b6618ec3adddbcbb1b9d881fa581a84aa401f69",
      "fileid": "28f4b6f25dfa0fadd759eb2dee66861eb6738d5d6ca846b343868bf8295980d8",
      "status": "success",
      "buildurl": "https://github.com/r-universe/cornball-ai/actions/runs/27866069871"
    },
    {
      "r": "4.7.0",
      "os": "win",
      "version": "0.1.1",
      "date": "2026-06-20T08:51:11.000Z",
      "commit": "3b6618ec3adddbcbb1b9d881fa581a84aa401f69",
      "fileid": "834f53de7fb0b21ad070c3ee692a640152cb524d32d5e2c90e3b5865c0541cbe",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cornball-ai/actions/runs/27866069871"
    },
    {
      "r": "4.5.3",
      "os": "win",
      "version": "0.1.1",
      "date": "2026-06-20T08:51:12.000Z",
      "commit": "3b6618ec3adddbcbb1b9d881fa581a84aa401f69",
      "fileid": "f2d09cf11349f7972bb17bf750042c96a2330f9412bf22220006cb1f2433273f",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cornball-ai/actions/runs/27866069871"
    },
    {
      "r": "4.6.0",
      "os": "win",
      "version": "0.1.1",
      "date": "2026-06-20T08:51:06.000Z",
      "commit": "3b6618ec3adddbcbb1b9d881fa581a84aa401f69",
      "fileid": "7206a56440134b15391f25298c1fe7a45f10e7d57db5d654ca74df1cba66acac",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cornball-ai/actions/runs/27866069871"
    }
  ]
}