inspect-jitsi
Tools for inspecting a running Jitsi Meet deployment.
Installation
Install the inspect-jitsi command with pipx:
pipx install inspect-jitsi[cli]
Install as a Python module only:
pip install inspect-jitsi
Command Line API
The command line requires installing inspect-jitsi[cli].
First, join or leave the room at meet.hosted.quelltext.eu/inspect-jitsi. Then run the commands:
inspect-jitsi count https://meet.hosted.quelltext.eu/inspect-jitsi
inspect-jitsi participants https://meet.hosted.quelltext.eu/inspect-jitsi
inspect-jitsi diagnose https://meet.hosted.quelltext.eu/inspect-jitsi
inspect-jitsi created https://meet.hosted.quelltext.eu/inspect-jitsi
| Command | Prints | Exit code |
|---|---|---|
count <url> |
number of participants | 0, or 1 on failure |
participants <url> |
participants as indented JSON | 0, or 1 on failure |
diagnose <url> |
connectivity/auth report as indented JSON | 0, or 1 on failure |
created <url> |
nothing (use --json to print true/false) |
0 if the room exists, 1 if not, 2 on failure |
count/participants fall back to running diagnose and printing its report
to stderr if they fail, to help explain why (e.g. a token being required).
Python API (Sync)
from inspect_jitsi import (
get_participant_count,
get_participants,
diagnose_jitsi_access,
is_room_created,
)
get_participant_count("https://meet.example.com/SomeRoomName") # -> 2
get_participants("https://meet.example.com/SomeRoomName") # -> [Participant(...), ...]
diagnose_jitsi_access("https://meet.example.com/SomeRoomName") # -> DiagnosisResult(...)
is_room_created("https://meet.example.com/SomeRoomName") # -> True
| Function | Returns |
|---|---|
get_participant_count(url, nick=None, ...) |
int |
get_participants(url, nick=None, ...) |
list[Participant] |
diagnose_jitsi_access(url, ...) |
DiagnosisResult |
is_room_created(url, ...) |
bool |
Participant and DiagnosisResult are dataclasses with .to_dict() (and
Participant also has .to_json()) for easy serialization. Participant
carries jid, nick, name (display name, if disclosed), role,
affiliation, real_jid, and occupant_id.
Python API (Async)
For anything beyond a single one-shot call - e.g. holding a room open and
polling it repeatedly - use JitsiConference directly instead of the sync
wrappers above; it's fully async/await:
import asyncio
from inspect_jitsi import JitsiConference
async def main():
async with JitsiConference("https://meet.example.com/SomeRoomName") as conference:
print(await conference.is_created()) # -> True, without joining
print(await conference.get_participants())
asyncio.run(main())
How it works
We try joining the room as a participant and inspect who is there.
Jitsi's prosody deployment locks down disco#info on MUC rooms to
occupants only (confirmed live: a bare disco#info query gets
<error type="auth"><forbidden/></error>), so the usual XEP-0045 "peek
without joining" trick doesn't work here. Instead, JitsiXmppConnection
briefly joins the room as a real (if anonymous) occupant over an XMPP
connection carried by WebSocket (the same wss://<domain>/xmpp-websocket
endpoint the web client itself uses), reads the roster of <presence>
stanzas the MUC sends back, then leaves - meaning the room briefly gains
(and loses) one occupant, and other participants may see a transient
join/leave notification.
No Python XMPP library (slixmpp, aioxmpp, ...) supports the WebSocket
transport Jitsi requires - they're TCP-only, and Jitsi deployments generally
don't expose raw XMPP client-to-server (port 5222) publicly - so
inspect_jitsi.xmpp.connection hand-rolls the small slice of RFC 6120
(stream/SASL/bind) and RFC 7395 (XMPP over WebSocket framing) needed to join
a MUC room.
jicofo (the conference focus component) also joins every active Jitsi
conference's MUC as a pseudo-participant nicknamed focus - that occupant
is filtered out so participant counts/lists reflect only humans.
Deployments (e.g. docker-jitsi-meet) commonly use an internal XMPP domain
(typically meet.jitsi) and MUC component (typically muc.meet.jitsi) that
differ from the public hostname in the URL - the public web server proxies
the WebSocket through, but the XMPP stream's to attribute and the MUC room
JID must use the internal names. discover_hosts figures these out
automatically by reading the site's public /config.js (the same file the
browser client itself relies on), rather than guessing.
Installing
pip install -e . # Python API only
pip install -e ".[cli]" # + the inspect-jitsi command line tool
pip install -e ".[test]" # + test dependencies
Testing
pytest
Release
- Edit the changelog
- Create a tag and push it.
git tag v0.0.1
git push origin v0.0.1
Release files for inspect-jitsi 0.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| inspect_jitsi-0.0.2.tar.gz | 39.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| inspect_jitsi-0.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 99.5 kB
Release files / inspect_jitsi-0.0.2.tar.gz
| Download URL | inspect_jitsi-0.0.2.tar.gz |
|---|---|
| Size | 39.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6836069e271b842a107b1b6c1e73cae4660795479278dd7df56ea304a53c8e2f
|
|
BLAKE2b-256 checksum How to use checksums |
97d77195be8a01ce2f069ee045bd86a5c6e828265bbaee3800cd3ca5e5996da5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency logRelease files / inspect_jitsi-0.0.2-py3-none-any.whl
| Download URL | inspect_jitsi-0.0.2-py3-none-any.whl |
|---|---|
| Size | 60.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d697315a22f7808acb785ebb5299214762d1354648bbd422e0db728ec2f497a6
|
|
BLAKE2b-256 checksum How to use checksums |
67378be6ac575cef40a7992cca42f5ec133bb62db5e747080aebaebef0fdaf86
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency log