Repository navigation
Releases: brnyxx/itda-cli
Release list
0.7.0 - 2026-10-24
Release Notes
Reads that get past a challenge, a knowledge base per site, and an agent that
prepares a site itself. A read a site answers with a challenge page now
recovers in the browser installed on the computer, and every request in that
mode carries that browser's user agent; a change is still sent once, over
direct HTTP, after a single-use approval. itda writes down what it found and
tried for each site, itda fsck lists what was never tried or keeps failing,
and itda_shape shows the shape of a page or an answer without its values.
When setup keeps one read or none, itda_prepare lets the agent draft the
site from its docs, seeing shapes and evidence, never what the site holds.
Added
itda_prepare, one MCP tool for an agent to prepare a site that
itda_setupdrafted thinly, as a loop the agent runs:start,recon
(the entry page, the API description it links, its GraphQL schema, the
routes its docs name and a draft itda made, each with an evidence id),
read,search,propose,verify,reviewandinstall. itda calls
no model and the agent never sees a value the site holds: only titles,
paths, methods, field names, selectors, keys, types, pointers and counts.
Each proposed operation is kept only when the evidence carries it (a
documented or answering server, the route in the docs or a page at that
path, something to check in an HTML answer), a declared read whose request
asks for a change becomes a change, a route that needs a sign-in itda
cannot use is dropped, and a draft that only reads the home page is
refused.verifytries the kept reads through the same path every call
takes, fills inputs from earlier answers with$result:<read>:<pointer>
(scalars only), addsrequired_pointersfrom the field names at the top
of the answer, says in counts where a page read's selectors miss, and
never sends a change. Reads go only to the site's registrable domain and the
hosts it links as documentation. A session has 120 calls, 48 page
requests and 24 check requests (browser recovery counted), 6 reads per
verifyand two coverage and two repair rounds.installtakes the same
path asitda_setup. Whenitda_setupkeeps one read or none, its result
carries aremedythat namesitda_prepare.reconwithbundles: true
also reads the scripts the entry page loads and keeps a route string only
when one GET answers with data.skills/itda-prepare/SKILL.mdis the loop
for skill loaders.- Reads that a site answers with a challenge page can recover through the
browser installed on the computer. itda fetches the page inside a hidden
browser window kept for that one site and account and, for aGET, lets
the page render. Every request in this mode, a change or a sign-in form
included, carries the browser's user agent, and the hidden window keeps the
browser's own client hints, so the site sees one client whichever way a
request goes and a clearance the browser earned holds for the direct
requests too. itda remembers which way worked for an hour, per site,
account and action, so the next call does not pay for the failed try
again, and forgets a way that
failed after a few minutes. The browser session stays warm in a worker
process across CLI calls and closes after five idle minutes; changing an
input does not restart it. Everything the page loads passes the same
address and read checks as a direct request: other sites get neither the
account's credentials nor a referrer, private addresses stay refused, and a
page may send a GraphQL query, never a mutation. A challenge the browser
did not get past fails that one read (blocked_by_site,paused: false)
without pausing the site. A browser answer may be up to 16 MiB. The worker
keeps its files underbrowser-runtime/in the data directory, one
directory per itda build; a build's directory is removed a day after it
stopped being used.ITDA_TRANSPORT=httpkeeps direct HTTP only, with the
pauses it always had.docs/HONEST_CLIENT.mdhas the rules,
docs/TRANSPORT_BENCHMARKS.mdthe measurements. - A local knowledge base per site, in
itda.db. Setup, check, refresh and
every call write down what was found and tried: the pages and actions,
which list read can supply which detail read's input, every try with its
stage, verdict, HTTP status and time, and the hashes of the definition and
the last verdict. It keeps shapes only (selectors with match counts, field
names, keys and types), never an answer, input, cookie, header value or
record. Nothing that sends a request reads it, anditda removedeletes a
site's rows. A call itda refused before sending (waiting for an approval,
a bad input) is not counted as a try. itda fsck [site]runs fixed rules over the knowledge base and lists,
worst first, the reads never tried, the reads that need an input (with the
list read and pointer that can supply it), the reads that fail every recent
try or now and then, and a definition or verdict file changed under itda,
each with the command to run. It sends nothing; exit 0, or 1 when a gap is
at priority 1. Over MCP,itda_managetakesfsck, and each gap carries the next tool to
call with its arguments.itda setupends with the top three.itda_shape, a read-only MCP tool: the shape of a page (selectors with
counts, named fields, the keys and types of embedded data) or of an
action's last answer (keys, types and pointers), from the knowledge base or,
withfresh, read now the way setup reads a page. At most 24 KB and no
values.itda ls --jsonanditda_sitessay per site how many actions answered on
their last try (verified), the recentpass_rateand the reads that fail
now and then (unstable).itda ls --jsonanditda_siteswith a site add
auser_guide(what can be read, what can be changed, how one read feeds
another) and two to fournatural_prompts, made by rule in the person's
language;itda describe <site>prints both.
Changed
-
The knowledge base records a preparation loop's tries under a stage of
their own,prepare, and its notes under thepreparescope; the pass
rate, the last success and theitda fsckrules leave both out. -
The honest-client rule changes: itda no longer stops at a challenge. Every
request carries the installed browser's user agent, a read may run inside
that browser after a challenge, and a challenged read no longer pauses the
site. What stays: a change is sent once, over direct HTTP, after a
single-use approval; credentials go only to their own site and account; one
request at a time per site, withRetry-Afterrespected, whichever way the
request goes; captchas are not solved.
Fixed
- Opening
itda.dbcould fail withinternal("Local file operation
failed") when another itda process, the browser worker or the MCP server,
closed its connection at that moment: SQLite removeditda.db-walwhile
itda was making it private. A file that is gone is now left alone.
Install itda-cli 0.7.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/brnyxx/itda-cli/releases/download/v0.7.0/itda-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/brnyxx/itda-cli/releases/download/v0.7.0/itda-cli-installer.ps1 | iex"Download itda-cli 0.7.0
| File | Platform | Checksum |
|---|---|---|
| itda-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| itda-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| itda-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| itda-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| itda-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.6.0 - 2026-10-23
Release Notes
Files in and out, a check after a lost answer, sessions kept in browser
storage, a gate that reads the request it is about to send, and twelve
languages. A change can name the read that shows it landed, so after a lost
answer itda checks once before anyone is asked to approve again. Reads can save
an attachment, and a change can send a file whose hash you approved. A
single-page app that keeps its session in localStorage now signs in. Setup,
the landing page and the READMEs speak twelve languages, and the mark is a
cursor striking a site.
Added
-
Twelve languages. What
itda setup,itda login,itda refreshand the
first bareitdaprint now comes in English, Korean, Japanese, Simplified
and Traditional Chinese, Spanish, French, German, Brazilian Portuguese,
Vietnamese, Indonesian and Russian, chosen fromITDA_LANGor the system
LANG(ja_JP.UTF-8,zh-TW,ptall resolve). The landing page picks the
browser's language, has a picker in the header and remembers the choice;
the README has one translation per language, linked from a language line at
the top of each. What agents act on (tool descriptions, error codes and
remedies) stays English. The strings live in
apps/cli/text/<tag>.json,site/i18n/<tag>.jsandREADME.<tag>.md;
docs/i18n.mdhas the glossary and the rules. -
Outcome check after a lost answer: a change may name the read that shows
it landed (confirm: {read, match: {pointer, from}}in the definition).
When the change is sent and its answer is lost (action_outcome_unknown,
exit 22), itda runs that read once, as a read, and reportslanded,
not_foundorunknownnext to the error, asoutcome_checkin the CLI
output,--json, the MCP result and the audit record (outcome_check,
confirm_read). The change is never resent. Afterlanded, a new approval
request for the same inputs carries anotein the review and
previous_outcome: landedin the answer, so the person can decline.itda auditlists lost answers with what the read said;itda_manage audit
returns them underunknown_outcomewithcheck.itda lsanditda doctorreport aconfirmthat names a missing operation, a change or a
read that needs inputs as a definition problem.itda setupanditda draftfillconfirmwhen aPOST's list read is on the same path prefix
and a string input of the change appears in the read's records; the
evidence says so. The lab getslossy(8089), the scripted portal whose
post is saved and then the line drops, and every reviewed lab definition
names its confirming read. -
Files out: a read may declare
response: {format: file, media_types: [...], max_bytes: N, allow_empty: false}. itda streams the answer to a file under
files/<site>/in the data directory (oritda call ... --out <dir>),
seals it at the end, and returns a manifest{path, bytes, media_type, sha256}, never the bytes; over MCP the result adds aresource_linkto
the file and the tool's description says what comes back. The content type
must be one ofmedia_types(an HTML answer only as an attachment), and a
206 orContent-Range, a body shorter than itsContent-Length, an empty
body or one over the cap fail by name (wrong_media_type,partial_answer,
empty_answer,too_large) and leave nothing on disk. File names come
from the site'sContent-Dispositionor the address, reduced to plain
characters, and never replace a file already there.itda checkskips file
reads. A transfer longer than the gate's turn renews it (Lease::renew)
every 30 seconds; a lost turn stops the transfer (request_lease_lost). -
Files in: a change may declare
body: {multipart: {fields: {...}, file: {name, from}}}. The agent gives the path of a file on this computer in the
frominput; the approval shows the file's name, size and SHA-256 and is
bound to that hash, so other bytes under the same path withdraw it
(approval_expired,reason: file_changed). The file is streamed from one
open handle in 64 KiB chunks withContent-Lengthset, its size and
modification time checked before every chunk and its hash at the end; a
file that changes mid-send aborts the send (action_outcome_unknown,
reason: file_changed). The audit log records the hash. A body with a file
is always a change and goes only to the site's own origin. -
Drafts: a page form with
enctype=multipart/form-dataand a file control
becomes such a change (Upload a file to <page>), and links the page
labels as attachments (adownloadattribute, download or attachment
words in English or Korean, or an icon named for one) become file reads
grouped by shape (download-filewith afile_idinput), with
media_typesfrom the kinds the links name or the usual document types.
itda draft haranditda recorddraft a recorded multipart post from its
part names and a recordedContent-Disposition: attachmentanswer as a file
read.itda describesays what a file read returns and where it lands, and
which input a change sends as a file. -
Storage sessions: a site that keeps no session cookie and instead holds a
token in the browser'slocalStorage(orsessionStorage) and sends it as
Authorization: Beareror a custom header now signs in and works. When you
set the site up or record it, itda reads that one origin's storage once, over
the DevTools protocol, from the window you signed in to, and recognises the
token as the session when the recorded calls actually sent it as a header: a
JWT shape, or a long opaque value under a key named liketoken,
access_token,id_token,auth,sessionorjwt. A stored value no
request sent is reported and never kept. It is drafted as akind: header
auth entry withvalue_from: storage:<key>; the token lives in the keyring,
never in the definition, anditda login <site> --browserreads it again at
the next sign-in. If the token is a JWT withexp,itda checkreports
signed_out(notsite_changed) once it has passed, anditda_sitesshows
when the sign-in expires; itda never signs in again on its own. The token is
redacted from results, errors and the audit log like a cookie.value_from
on aheaderentry now acceptsstorage:<key>besidestore:<site>/<key>,
and on abrowserentryquery:<key>besidecookie:<name>, with a
validation error for anything else. itda reads only the signed-in origin's
storage, never another site's, never a profile on disk, and never writes
anything into a page; seedocs/THREAT_MODEL.md. The definition format is
unchanged:spec_versionstays 1. -
The API description a page points at is also found in the first page's
HTTPLinkheader (RFC 8288) and under two more relations:api-catalog
(RFC 9727) anddescribedby, in the header or on<link>/<a>.
Learning where costs no request.service-descwins, thenapi-catalog,
thendescribedby. An API catalog is a linkset (RFC 9264): itda follows
itsservice-desclinks, up to three, and takes the first OpenAPI
document. Adescribedbydocument counts only when it is one; otherwise
/openapi.jsonis still tried.relis matched as a list of relation
types, case-insensitively, sorel="not-service-desc"no longer counts.
Pagination'sheader:linkreads the header with the same parser, so a
target with a comma in it orrel="Next"is read right. -
itda spec validate <file> [--json]checks a definition the wayitda addwould (Spec::validateand the policy checks), without installing
it. A valid file exits 0; otherwise every problem is printed asproblem: <field>: <detail>, the way a draft prints its own, and it exits 2, the
definition-problem code.--jsongives{status, file, site, actions, issues}.
Changed
- The mark is a cursor striking a site; the hero shows it. The tile is a
white cursor at the bottom left, a browser window at the top right and a
blue bolt inside the window where the cursor's tip touches it. The favicon
is a heavier cut of the same tile that reads at 16 px. The landing's hero
adds the cursor from the mark: it flies in, strikes the terminal's prompt,
the transcript appears, it strikes the About window, and it holds; with
prefers-reduced-motionit rests at the prompt.assets/logo.svgis the
one master;assets/src/mark.pystamps it into the wordmarks and the hero,
assets/src/flow.pyreads it, andassets/social.htmlrenders the link
preview from it. The README banners (assets/hero.png,
assets/hero.ko.png) are rendered again and carry it in the wordmark. - The gate reads the request it is about to send, not only the declared
inputs. After the template is rendered, every query key and body field,
the value of an intent field such asactionormode, and any GraphQL
document inquery(orq/documenton a GraphQL path) are read again.
A declared read whose rendered request asks for a change (ajson_template
whose literal body is a mutation,{"op": "delete"}deep inside it) is
treated as a change:approval_requiredcarriesreclassifiedwith the
reason, the review shows it, and the audit record sayseffect: write
with the samereclassifiedreason. A read whose effect cannot be told (a
GraphQL endpoint sent no document, a document itda cannot read) stops with
effect_unknown(exit 2) and a remedy; nothing is sent. A declared write
is unchanged, and so are the 101 reads in the bundled definitions. itda describeshows the read a change names inconfirm, one line under
the change in the person's language (after a lost answer: checks list-notices for the new title);--jsonaddsconfirm: {read, match}.
The change's MCP tool description says the same in English, and
itda_describein catalog mode now returns the same description as the
tool, the app...
0.5.0 - 2026-10-23
Release Notes
Uglier sites, fewer steps, and a bundle for Claude Desktop. itda setup now
reads pages whose content sits in frames, signs in with a password without a
browser, follows a session carried in the address, turns pages, recognises
known software, and refreshes a definition when the site changed. The landing
page says plainly what works and what does not. Every release now carries an
MCP Bundle per platform, so Claude Desktop installs itda by opening a file.
Added
-
Frames: when
itda draft pageoritda setupfetches a page that is a
shell whose content lives in one or more<iframe src>(or an older
frameset) on the same origin, and the page has nothing of its own to read,
itda fetches each frame page as itself, on the same pacing and with the same
session, and drafts from the frame pages as pages of the site, each under
the frame's own address. At most four frames are followed, at most two deep;
a cross-origin frame, and a same-origin frame that answered with nothing,
are listed in the notes and never fetched. The setup lines and the draft say
what was followed ("Followed 1 frame: /frame/board.").itda refresh
follows them again. -
Query sessions: a site that carries its session in the URL as a query key
(?sid=...) rather than a cookie now gets akind: browserauth entry with
value_from: query:<key>.itda draft har,itda recordanditda setup
recognise it when a sign-in's answer hands the key out (in the redirect
Locationor on the first signed-in page) and every signed-in call carries
it: every operation that sent it getsauth: session, the key is dropped
from the operations' inputs, and the value goes to the keyring, never into
the definition.itda login <site>captures it from the sign-in the same
way it captures a cookie. At run time the value is appended to the query of
each request; it is redacted in results, error text, the audit log and the
recording kept for a refresh (addresses,Locationheaders and the links in
recorded pages).value_fromon abrowserentry now acceptsquery:<key>
besidecookie:<name>, with a validation error for anything else. Because
the value rides in URLs,docs/THREAT_MODEL.mdnotes it can reach server
and proxy logs. The definition format is unchanged:spec_versionstays 1. -
cargo xtask check-changelog, run by CI: the changelog has one of each
section per release, the newest release matches the workspace version, and
the landing page and quickstart print the same version. CONTRIBUTING.md
says what a minor and a patch version mean before 1.0. -
Sign in with a password, without a browser: a
loginblock on abrowser
credential names the site's sign-in page and its user and password fields,
anditda login <site> --user mereads the page as itda, fills the form
in with the password you type (or pipe on stdin), sends it once with the
hidden fields and cookies the page gave, and keeps the session the way a
browser sign-in is kept. A redirect means the site accepted it; the form
coming back is reported, never retried.itda setup <page> --user medoes
the same when the page needs a sign-in (a redirect to a sign-in page, 401
or 403, or a "log in to see this" page that links to one), drafts from the
page as you see it signed in, gives every actionauth: sessionand writes
theloginblock from the form it found. Over MCP,itda_setupnever
takes this path.--secretonitda loginnow names the API key path
explicitly (api-keystays the name when the site has no sign-in form). -
examples/lab: Gitea, Redmine, WordPress, MediaWiki and a small legacy
intranet (intranet/server.py, standard library only) in Docker Compose,
pinned by digest, on fixed local ports, with one seeded account and a
little content each, plus reviewed definitions inspecs/. With
ITDA_LAB=1,apps/cli/tests/lab.rswalks each one fromitda setup --userthroughitda login, a read, a change approved in a terminal and
the audit log. CI never runs it. -
examples/lab: three uglier intranets alongside the five, to measure what
itda does on pages built the harder ways (intranet/framed.py,
scripted.py,urltoken.py, standard library only).framed(8086) keeps
the notices table two iframes deep, so setup from the home page finds only
the shell; pointed at the frame it signs in and reads and writes the board,
andspecs/framed.yamlruns to an approved change.scripted(8087) draws
the table fromGET /api/noticesin a script, soitda setup --watch-only
watches the browser load it and drafts the read, andspecs/scripted.yaml
posts with theX-CSRF-Tokenfrom<meta name="csrf-token">.urltoken
(8088) carries its session in?sid=with no cookie; with frame following
and query sessions in this release, setup signs in, reads thesidfrom the
sign-in redirect and keeps it as avalue_from: query:sidsession, and
specs/urltoken.yamlruns to an approved change.README.mdrecords the
measured outcome per case; the one itda cannot do yet - signing in from a
shell whose frame redirects to a login, soframedfrom the home page still
finds only the shell - is a test marked#[ignore]with the reason. -
Sites that run known software are recognised.
itda setupreads the
page's HTML for GitLab, Jira, Confluence, Redmine, Discourse, MediaWiki,
WordPress and Gitea or Forgejo (ageneratormeta, well-known asset paths,
the Atlassian context-path metas, body classes), confirms the guess with
exactly one GET to that software's own version or info endpoint, and then
drafts from a template undersites/software/instead of reading the page
like any other: the reads an agent needs most, up to three changes marked
as such, models and the software's own way of signing in, every operation
with its documentation inevidence. The template'sbase_urlis filled
with the instance's API base, context path included (/jira,/w, a
GitLab relative URL root, a GiteaappSubUrl, the WordPress API root the
page links to); the site is named after the host; one line says so ("This
looks like GitLab. Using its API at ."). The page draft still runs
and its lists, forms and feeds join the template, the same method and path
drafted once, and a page that needs a sign-in or scripts still gets the
template when the software is confirmed. A fingerprint the API does not
confirm is dropped quietly.itda setup --as <software>forces a
template,--no-templateskips them,itda checkworks on the result as
on any site, anditda_setupover MCP takestemplateand names the
template it used in its result. The site'ssources.jsonnames the
template and its API base, soitda refreshfills the same template
again, with the page read again when it still opens. -
itda refresh <site>: whenitda checksayssite_changed, draft the
site again from the sources it was set up from and merge the result with
the installed definition. The site's name, title and address,defaults,
authand every action edited by hand are kept; actions the draft
changed take the new version, ones it no longer drafts are dropped only
when their read also failed, and new ones are tried once and added when
they answer. The diff is printed in plain words (added, removed, changed,
kept as edited) and written after a yes, or at once with-y; the site
is checked right after and the verdict printed. Approvals for the site
are withdrawn, as for any replaced definition: what the user reviewed is
no longer what would be sent.
To make that possible,itda setup,itda draft ... --installanditda record --installnow writespecs/<site>/sources.jsonnext to the
definition: the pages, the API description, the GraphQL endpoints asked,
the recording when one was kept (copied under the site as
recording.harwith its cookie, token and session values, private
fields and sign-in answers blanked), the draft's options and a hash of
every operation as drafted.itda checknow points atitda refresh <site>when a site
changed, anditda check --allprints one verdict line per site. -
itda_manageover MCP gainsrefresh: the person confirms the diff in a
form (a form nobody answers counts as no), and the site's tools are
reloaded and checked.itda_checkwithout a site already checks every
site; the docs now say so. -
itda draft pageanditda setupread a page that is one thing (an
article, a package, a product, a bug) as its own content: the headline,
the body text, what sits beside the headline, a date, an author and the
values the page labels in definition lists and label-value rows, as
html.pagefields that each match once. Such a page used to be one read
that checked the title. A page that is one thing with a named list of
records on it (a package with its releases) gets both reads, anditda setupsays "the page's own content" when it finds one. -
Repeated siblings of one shape become records when they share a title at
one place: a link as before, or a heading, a text named as a title, or
the record itself when it is a link with something inside. The fields come
from what the records share: a summary, a byline, a date, and whatever
sits under a class the site named (score,author,release__version
becomesversion), with build names left out and a text that reads as a
date aspublished_at. Bare paragraphs, bare links and menus never
qualify. A list read is described by what its records are (List the projects on Projects) when the page names them. -
A list whose links share one shape (
/item/{id},view.php?id=) gets a
read of one record by itsid, with the query keys every link sends as
inputs with defaults and no response check yet. -
The
pageinput follows the link markedrel="next"and star...
0.4.0 - 2026-10-22
Release Notes
One address is enough: itda setup looks at a page, or watches you use the
site in your own browser, names what agents will be able to do in plain words,
tries every read, and connects an agent. Any website, not only the ones with an
API description.
Added
itda setup <url>sets a site up in one go: it looks at the page, or
opens your browser and records when the page refuses, needs a sign-in or
is drawn by scripts; shows what agents will be able to do in plain words;
tries every read once and keeps the ones that work; saves the site; and
connects an agent. It asks before each step;--record/--no-record,
--clientand--yesanswer for scripts.ITDA_LANG=ko(or a Korean
LANG) makes it, and the drafted descriptions, speak Korean.- Drafted actions carry a description a person would say (
List what Notices shows,공지사항 목록 읽기), taken from the page's title or the
call's name, in English or Korean. itda record <url>opens your own browser in a fresh window and records
what the pages ask the server for while you use the site, then drafts a
definition the same wayitda draft hardoes. The recording stays in
memory;--savekeeps it as a HAR file. itda never clicks, types or
navigates in the window.ITDA_DEBUG_CDP=1prints the browser messages.itda record --installoffers to keep the token and the browser session
the recording signed in with, each after a yes in the terminal, so a site
that sends a bearer token from its scripts works without pasting it.- A recorded GraphQL call becomes one action per operation (
exploreProjects
isexplore-projects): queries are reads, mutations are changes, and the
variables are the typed inputs, rendered through ajson_template. itda recordanditda draft haralso draft the pages the recording
holds, asitda draft pagedoes, so a site that renders its lists and
forms on the server gets actions even when its pages call no API.itda draft page <url>...drafts a site definition from the pages you
use, fetched with the honest client: a table or a list of records becomes
htmlfields, data a page embeds for its scripts becomesssr_json, a
search form becomes a read, a post form becomes a change with its token
read through a preflight step, page links become apageinput, and RSS or
Atom feeds come along. Every read gets a response check, soitda check
notices when a page changes. Lists are found by their shape, not only by
known class names: any run of three or more siblings outside navigation
that each hold a link at the same place, with the title and link read
from that link's own path. When a page embeds its data for its scripts,
the draft pointsextract_pointerat the list inside the payload and
checks the keys every record shares.itda draft haralso handles a token sent as a header, such as
X-CSRF-Token: a preflight step reads it from the page's
<meta name="csrf-token">tag before each call.itda addalso takes an https URL, or the name of a ready-made site
(itda add github); the four definitions insites/are built in.
Changed
itda setupnames the agent app it connects ("Adding itda to Claude
Desktop..."), shows the settings file it wrote with~for your home
folder, says so in Korean too, lines the action names up only as wide as
they need, and writes its example request mid-sentence.- The README and the landing page open with a recording of
itda setupas
it ran on Hacker News (assets/setup.gif, Korean inassets/setup.ko.gif,
rebuilt fromassets/src/setup.*.tapewith vhs). - A new key visual, a hand passing a website card to an agent
(assets/handoff.png), on the README banners and the link preview
(assets/hero.png,assets/hero.ko.png,assets/social.png, rendered from
assets/src/banner.html), and the docs introduction says the same thing the
README does.
Install itda-cli 0.4.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/brnyxx/itda-cli/releases/download/v0.4.0/itda-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/brnyxx/itda-cli/releases/download/v0.4.0/itda-cli-installer.ps1 | iex"Download itda-cli 0.4.0
| File | Platform | Checksum |
|---|---|---|
| itda-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| itda-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| itda-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| itda-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| itda-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.3.0 - 2026-10-20
Release Notes
Install ready-made sites with one command, and work with old intranet forms
that need a fresh security token on every change.
Added
- Preflight steps: an action can read a page just before it runs and pass
a fresh value, such as a CSRF token, into its headers, query or form as
{{step.<step>.<name>}}. Agents never see or set those values. - The sandbox has a write form with a one-time CSRF token
(sandbox.write-notice) to try preflight steps on. itda draft harturns a form token such as_csrfinto a preflight step
that reads it from the form page recorded before the post.itda add <file>installs a site definition (or-for stdin) and shows
where it sends requests, which actions change the site and how it signs
in;itda remove <site>takes it away.- Ready-made site definitions in
sites/: GitHub (public reads without an
account, issues and comments with a token), npm, crates.io and PyPI.
Changed
- A
modelnow applies to each record when the answer is a JSON list,
instead of returning an empty object.
Install itda-cli 0.3.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/brnyxx/itda-cli/releases/download/v0.3.0/itda-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/brnyxx/itda-cli/releases/download/v0.3.0/itda-cli-installer.ps1 | iex"Download itda-cli 0.3.0
| File | Platform | Checksum |
|---|---|---|
| itda-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| itda-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| itda-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| itda-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| itda-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.2.0 - 2026-10-20
Release Notes
Sign in through your own browser, approve changes inside the agent app, and
check that sites still answer the way their definitions say.
Added
itda accountslists signed-in accounts and the names of their secrets;
itda logout <site>removes an account and its saved secrets.itda check [<site>]runs every read that needs no input and reports which
ones no longer match the site, with exit code 11 when a site changed.- Browser sign-in for sites without API keys:
itda login <site> --browser
opens your own browser in a fresh profile, keeps only that site's session
cookies in the system keyring, andkind: browseractions send them only to
the same site. - Approve changes inside the MCP client: with
itda mcp --approve-in-client
(oritda mcp install <client> --approve-in-client), clients that show
elicitation forms ask you to approve the exact request, and declining
returnsapproval_rejected.
Install itda-cli 0.2.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/brnyxx/itda-cli/releases/download/v0.2.0/itda-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/brnyxx/itda-cli/releases/download/v0.2.0/itda-cli-installer.ps1 | iex"Download itda-cli 0.2.0
| File | Platform | Checksum |
|---|---|---|
| itda-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| itda-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| itda-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| itda-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| itda-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.1.0 - 2026-10-19
Release Notes
The first release: reads and approved changes on plain HTTP sites with API
keys, from the command line or over MCP, and definitions drafted from OpenAPI documents or browser recordings.
Added
itdacommand:ls,call,login,resume,doctor, with a stable
exit code contract for scripts and agents (2input,10sign in,11
page changed,12blocked,13rate limited,20–22approvals and
changes,30network).- MCP server (
itda mcp): one tool per action up to 30 actions, three stable
catalog tools (itda_search,itda_describe,itda_call) above that.
Results are marked untrusted and cut to 24 KB. itda draft openapi: draft a site definition from an OpenAPI 3 or
Swagger 2.0 document, with response checks, header auth and a list of what
could not be translated.--installputs it in the data directory.itda draft har: draft a site definition from a browser recording of you
using the site. Only the shape of each call is kept; recorded tokens,
cookies and values never reach the draft.itda mcp installfor Claude Desktop, Cursor, VS Code and Codex, and the
claude mcp addcommand for Claude Code. Existing settings are kept and
backed up.- Approvals for changes: a change returns an approval id, the user reviews
the exact request withitda approvein a terminal, and the change runs
once with exactly those inputs.itda approvalsanditda rejectlist and
refuse them. - Hash-chained audit log of every call, approval and change, with
itda auditanditda audit --verify. Input values and credentials are
never written to it. - Credential vault on the OS keyring, or
ITDA_SECRET__environment variables
for CI and containers. Agents only ever see account ids. - Site definitions (
spec.yaml): JSON and server-rendered HTML responses,
declared response checks, models, and safety validation with named
problems. - Network layer: honest
itda/<version>user agent, per-site pacing and
budgets, pauses on blocks and expired sign-ins, private-address guard,
credentials bound to their origin. - Sandbox example site for trying everything locally.
Install itda-cli 0.1.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/brnyxx/itda-cli/releases/download/v0.1.0/itda-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/brnyxx/itda-cli/releases/download/v0.1.0/itda-cli-installer.ps1 | iex"Download itda-cli 0.1.0
| File | Platform | Checksum |
|---|---|---|
| itda-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| itda-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| itda-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| itda-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| itda-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |