Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion components/StructuredData.js
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ export const softwareApplicationNode = {
'Re-resolve a drifted target from structure, template, OCR, and geometry evidence before any model is consulted',
'Re-check record identity against a freshly captured frame immediately before each consequential input',
'Verify the intended business effect out-of-band against the system of record rather than trusting the acting session',
'End every consequential run verified or halted, with a preserved run report',
'Preserve a typed transaction outcome, including RECONCILIATION_REQUIRED when possible delivery cannot be proved',
'Keep recordings, screenshots, and compiled bundles inside the customer boundary; egress only an approved, hash-bound sanitized derivative',
'Execute on browser, Windows UI Automation, macOS Accessibility, Linux AT-SPI, RDP, and Citrix/VDI surfaces',
],
Expand Down
14 changes: 2 additions & 12 deletions cypress/e2e/download.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,20 +55,10 @@ function completeRelease(tag, publishedAt) {
describe('download page is server-rendered', () => {
it('ships the desktop release state in the initial HTML', () => {
// The release list is resolved server-side, so the raw HTML
// (before any JavaScript runs) must already contain a definite
// state — never a client-side loading placeholder.
// (before any JavaScript runs) must already contain a definite state.
cy.request('/download').its('body').then((html) => {
expect(html).to.not.include('Finding the latest release')
const definiteStates = [
'Beta release', // complete Beta release
'Desktop release', // complete legacy asset set during transition
'No complete native desktop release yet', // none
'We could not reach GitHub just now', // build-time fetch miss
]
expect(
definiteStates.some((state) => html.includes(state)),
'initial HTML contains a server-resolved release state'
).to.equal(true)
expect(html).to.match(/data-release-state="(?:ready|none|error)"/)
})
})

Expand Down
83 changes: 83 additions & 0 deletions data/compare/api.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
{
"slug": "api",
"competitor": "a supported API",
"positioningSummary": "Use a supported API whenever it exposes the full operation. Use OpenAdapt only for the UI-bound remainder, and use a read-only API as the verifier when one exists.",
"dimensions": [
{
"id": "determinism-on-drift",
"label": "Determinism when interfaces drift",
"openadapt": "A compiled workflow re-resolves targets from retained evidence, produces a governed repair proposal, or halts when the visible interface changes beyond its contract.",
"them": "An API bypasses interface layout entirely. Its callers depend on the service's published request, response, and authentication contract instead of screen geometry.",
"sources": [
{"label": "HTTP semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
]
},
{
"id": "cost-per-run",
"label": "Cost per run",
"openadapt": "A healthy compiled run makes no model call, but GUI execution still needs a browser, desktop, or remote session.",
"them": "A direct HTTP API exchanges request and response messages without GUI actuation. Provider charges and rate limits are service-specific.",
"sources": [
{"label": "HTTP messages", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-messages"},
{"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
]
},
{
"id": "verification-of-effects",
"label": "Verification of business effects",
"openadapt": "OpenAdapt separates actuation from verification. A read-only API, SQL query, file check, or second interface can prove the effect after the GUI action.",
"them": "A response status describes how the server handled the request. For consequential work, the caller can add a separate read-back or postcondition check instead of treating request acceptance as the complete business result.",
"sources": [
{"label": "HTTP status code semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-status-codes"},
{"label": "OpenAdapt effect-verifier kit", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"}
]
},
{
"id": "halting-behavior",
"label": "Halting behavior",
"openadapt": "The workflow refuses before actuation when identity, target, or policy checks fail. If an action may have been dispatched but its effect cannot be proved, it returns RECONCILIATION_REQUIRED without a blind retry.",
"them": "The client owns error handling, idempotency, retries, and reconciliation. HTTP defines conditional request and method semantics, but the application must use them correctly.",
"sources": [
{"label": "HTTP conditional requests", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-conditional-requests"},
{"label": "OpenAdapt execution outcomes", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EXECUTION_PROFILES.md"}
]
},
{
"id": "data-locality",
"label": "Data locality",
"openadapt": "The GUI runtime and retained evidence can stay inside a customer-controlled boundary.",
"them": "The client sends request messages to the API server. The service's deployment contract governs the data after it crosses that network boundary.",
"sources": [
{"label": "HTTP messages", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-messages"},
{"label": "OpenAdapt trust center", "url": "https://openadapt.ai/security"}
]
},
{
"id": "scope",
"label": "Scope: browser, desktop, RDP/Citrix",
"openadapt": "OpenAdapt handles operations that exist only through browser, native desktop, or customer-qualified remote-window interfaces.",
"them": "An API is the best fit when the service owner exposes the complete operation through a supported machine interface. HTTP defines the exchange, while the service defines the available business operations.",
"sources": [
{"label": "OpenAdapt comparison overview", "url": "https://openadapt.ai/compare"},
{"label": "HTTP semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"}
]
}
],
"strengths": [
{"text": "A direct API bypasses screen rendering, focus, pointer movement, and visual target resolution.", "source": {"label": "HTTP semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"}},
{"text": "HTTP requests and responses have a defined message structure, and responses carry explicit status codes.", "source": {"label": "HTTP message semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-messages"}},
{"text": "Authentication and conditional requests have standard protocol semantics that clients can test directly.", "source": {"label": "HTTP authentication and conditions", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"}},
{"text": "The service owner can support the integration contract as the user interface changes.", "source": null}
],
"faq": [
{
"question": "Should I use OpenAdapt when an API already does the job?",
"answer": "No. Use the supported API for the complete operation. OpenAdapt fits the steps the API does not expose, and the API can still serve as an independent verifier after GUI actuation.",
"sources": [
{"label": "HTTP semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"label": "OpenAdapt comparison guide", "url": "https://openadapt.ai/compare"}
]
}
]
}
86 changes: 86 additions & 0 deletions data/compare/autohotkey.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
{
"slug": "autohotkey",
"competitor": "AutoHotkey",
"positioningSummary": "AutoHotkey is a fast local tool for Windows hotkeys and macros. OpenAdapt is for shared workflows that need retained evidence, governed repair, qualification, and independent effect verification.",
"dimensions": [
{
"id": "determinism-on-drift",
"label": "Determinism when interfaces drift",
"openadapt": "A compiled workflow resolves targets from retained evidence and halts or proposes a reviewable repair when the interface leaves its contract.",
"them": "An AutoHotkey script deterministically sends the commands its author wrote. Coordinate and active-window macros can break under layout changes; control-oriented scripts can be more stable when the application exposes useful controls.",
"sources": [
{"label": "AutoHotkey Send", "url": "https://www.autohotkey.com/docs/v2/lib/Send.htm"},
{"label": "AutoHotkey ControlClick", "url": "https://www.autohotkey.com/docs/v2/lib/ControlClick.htm"},
{"label": "AutoHotkey ControlSend", "url": "https://www.autohotkey.com/docs/v2/lib/ControlSend.htm"},
{"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
]
},
{
"id": "cost-per-run",
"label": "Cost per run",
"openadapt": "The MIT local runtime has no per-run license fee, and a healthy compiled run makes no model call.",
"them": "AutoHotkey is free and open source. A normal local macro has no per-run license fee and makes no model call.",
"sources": [
{"label": "AutoHotkey license", "url": "https://www.autohotkey.com/docs/v2/license.htm"},
{"label": "OpenAdapt MIT license", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/LICENSE"},
{"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
]
},
{
"id": "verification-of-effects",
"label": "Verification of business effects",
"openadapt": "A consequential run returns VERIFIED only after an independent check proves the intended change in the system of record.",
"them": "AutoHotkey can read text from a window control. The author must build any business-level read-back, file check, database query, or other effect oracle.",
"sources": [
{"label": "AutoHotkey ControlGetText", "url": "https://www.autohotkey.com/docs/v2/lib/ControlGetText.htm"},
{"label": "OpenAdapt effect-verifier kit", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"}
]
},
{
"id": "halting-behavior",
"label": "Halting behavior",
"openadapt": "Identity, target, policy, and effect checks define explicit halt conditions, and uncertain delivery is preserved for reconciliation.",
"them": "The script decides when to stop. WinWait can pause until a matching window exists, but the author still defines every business stop and reconciliation rule.",
"sources": [
{"label": "AutoHotkey WinWait", "url": "https://www.autohotkey.com/docs/v2/lib/WinWait.htm"},
{"label": "OpenAdapt execution outcomes", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EXECUTION_PROFILES.md"}
]
},
{
"id": "data-locality",
"label": "Data locality",
"openadapt": "Recordings, compiled bundles, and run evidence can stay in a customer-controlled boundary.",
"them": "AutoHotkey runs on the Windows machine. Data stays local unless the script sends it to another service.",
"sources": [
{"label": "AutoHotkey overview", "url": "https://www.autohotkey.com/"},
{"label": "OpenAdapt trust center", "url": "https://openadapt.ai/security"}
]
},
{
"id": "scope",
"label": "Scope: browser, desktop, RDP/Citrix",
"openadapt": "The runtime covers browser, native desktop, and customer-qualified remote-window workflows, with current scope bound to published qualification evidence.",
"them": "AutoHotkey targets Windows input, windows, and controls. It can drive whatever is visible to that Windows session, but remote and browser semantics remain the script author's responsibility.",
"sources": [
{"label": "AutoHotkey ControlClick", "url": "https://www.autohotkey.com/docs/v2/lib/ControlClick.htm"},
{"label": "OpenAdapt qualification evidence", "url": "https://docs.openadapt.ai/get-started/what-works-today/"}
]
}
],
"strengths": [
{"text": "Send can simulate keystrokes and mouse clicks in the active window.", "source": {"label": "AutoHotkey Send", "url": "https://www.autohotkey.com/docs/v2/lib/Send.htm"}},
{"text": "ControlClick can target a window control without relying only on the current pointer position.", "source": {"label": "AutoHotkey ControlClick", "url": "https://www.autohotkey.com/docs/v2/lib/ControlClick.htm"}},
{"text": "Small hotkey, remapping, and text-expansion scripts are quick to write and easy for one operator to run.", "source": {"label": "AutoHotkey quick reference", "url": "https://www.autohotkey.com/docs/v2/"}},
{"text": "The runtime is free, open source, and local to Windows.", "source": {"label": "AutoHotkey license", "url": "https://www.autohotkey.com/docs/v2/license.htm"}}
],
"faq": [
{
"question": "When should a personal macro become an OpenAdapt workflow?",
"answer": "The change makes sense when other people depend on it, failures become hard to see, the target drifts often, or a wrong business result costs more than a visible macro error.",
"sources": [
{"label": "AutoHotkey quick reference", "url": "https://www.autohotkey.com/docs/v2/"},
{"label": "OpenAdapt effect-verifier kit", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"}
]
}
]
}
Loading
Loading