Overview
The 3xcode org command group lets you create or join an organization to share licensing and visibility with teammates. Running bare 3xcode org with no subcommand defaults to org me, showing your current membership.
Shareable join codes
Creating an organization returns a short org code you can hand to teammates: no invite emails or admin console required to get someone added.
Hybrid licensing
Individual, per-account licenses remain the default for everyone. An organization can additionally be provisioned a shared license by an admin, layered on top rather than replacing individual licenses.
Creating an Organization
3xcode org create creates a new organization and joins it immediately as its first member. If you don't pass --name, the CLI prompts for one interactively.
$ 3xcode org create --name "Acme Data Platform" Creating organization "Acme Data Platform"... ✓ Organization created Name: Acme Data Platform Org code: ACME-7QK2 Share this code with teammates so they can join: 3xcode org join ACME-7QK2
The org_code printed on success is the value teammates pass to 3xcode org join. Share it however's convenient (chat, email, an internal wiki page). There's no separate invite flow to manage.
Joining an Organization
3xcode org join <code> joins the organization identified by a code someone shared with you.
$ 3xcode org join ACME-7QK2 Joining organization... ✓ Joined "Acme Data Platform" Members: 4
org create
Creates a new org, joins it as the first member, and prints a shareable join code. Prompts for a name if --name is omitted.
org join <code>
Joins an existing org by its code. Prints the org's name and current member count on success; an unrecognized code returns a clear not-found error.
Checking Your Membership
3xcode org me shows the organization you belong to, which is also what runs when you type bare 3xcode org with no subcommand.
org me output
| Field | What it shows |
|---|---|
| Name & code | The organization's display name and its join code. |
| Your role | Your role within the organization. |
| Member / seat count | How many teammates have joined. |
| Shared license | Whether the org has an admin-provisioned shared license, and if so its usage mode: `Per-seat` or `Shared pool`. |
If you're not currently in an organization, org me prints a hint to run org create to start one or org join <code> to join an existing one. 3xcode profile also surfaces your organization detail (name, code, role, and seats) alongside your individual account info.
Hybrid Licensing Model
Licensing in 3XCode is hybrid, not either/or. Every account keeps its own individual license by default. This is what governs your account whether or not you ever join an organization. Joining or creating an org doesn't take that away.
On top of that, an organization can optionally be given a shared license, provisioned by an admin. When a shared license exists, license resolution at conversion time works org-first, individual-fallback:
1. Org license checked first
If you belong to an org with an active shared license, conversions draw against that shared license: either per-seat or from a shared pool, depending on how the admin configured it.
2. Individual license as fallback
If there's no org, no shared license, or the shared license is exhausted/invalid, the CLI falls back to your own individual license, the same one that governs a solo account.
org me tells you which mode a shared license is running in: Per-seat (each member draws from their own allotment within the org license) or Shared pool (all members draw from one combined pool). Either way, license state (validity, tier, conversions remaining, expiry) is checked at the start of every conversion, so a monthly limit hit anywhere in the resolution chain surfaces immediately with a clear reason.
Machine Binding & Device Caps
License validation is bound to a stable machine fingerprint (derived from your machine's hostname, CPU architecture, and OS, one-way hashed) sent automatically on every authenticated request. This is invisible in normal use: there's no prompt or consent screen, it just lets the backend enforce how many distinct machines a license can be active on at once. The fingerprint deliberately excludes the MAC address: on some OSes (macOS included) the underlying lookup can return an unstable, per-process value, which would otherwise make a background worker compute a different fingerprint than the interactive process that spawned it.
Per-tier machine caps
| Tier | Machines per license |
|---|---|
| Free | 1 |
| Pro | 2 |
| Team | 10 |
| Enterprise | 999 |
Individual licenses: capped
An individual license is limited to the machine count for its tier. Logging in and converting from more machines than your tier allows will hit the cap.
Org-shared licenses: exempt
A shared license provisioned for an organization is exempt from the per-machine cap by design: it's meant to be used across many teammates' machines at once.
The fingerprint is persisted locally so it stays consistent across reboots and across processes on the same machine, including a detached background worker started with pyspark convert --detach, which needs to agree with the interactive CLI process it was spawned from. Only the hashed fingerprint and CLI version travel over the network; the raw hostname, architecture, and OS values never leave your machine.