Skip to content
NorthstarPlatformPricingLogin

Legacy Software Automation

Northstar operates enterprise software through the GUI — no API required.

Salesforce Classic, SAP, Oracle Forms, internal admin panels, government portals — critical business software that runs entirely through a GUI with no usable API. Northstar operates these systems the same way your team does: by looking at the screen and clicking through the interface.

legacy_crm.py
from tzafon import Lightcone
client = Lightcone()
for event in client.agent.tasks.start_stream(
instruction=(
"Open Firefox and go to https://crm.example.com. "
"Log in with 'ops@example.com' / 'ops123'. "
"Navigate to Contacts > New Contact. "
"Fill in: First Name 'Jane', Last Name 'Smith', "
"Email 'jane.smith@acme.com', Company 'Acme Corp'. "
"Click Save. "
"Verify the contact was created successfully."
),
kind="desktop",
max_steps=30,
):
print(event)
legacy_crm.ts
import Lightcone from "@tzafon/lightcone";
const client = new Lightcone();
const stream = await client.agent.tasks.startStream({
instruction:
"Open Firefox and go to https://crm.example.com. " +
"Log in with 'ops@example.com' / 'ops123'. " +
"Navigate to Contacts > New Contact. " +
"Fill in: First Name 'Jane', Last Name 'Smith', " +
"Email 'jane.smith@acme.com', Company 'Acme Corp'. " +
"Click Save. Verify the contact was created successfully.",
kind: "desktop",
max_steps: 30,
});
for await (const event of stream) {
console.log(event);
}

Northstar finds the fields, handles dropdowns, navigates multi-step forms, and adapts when the layout changes. No selectors to maintain.

Northstar isn’t limited to web apps. On a full desktop, it can operate any native application:

with client.computer.create(kind="desktop", persistent=True) as computer:
# Install the software if needed
client.computers.exec.sync(computer.id, command="apt-get install -y libreoffice")
for event in client.agent.tasks.start_stream(
instruction=(
"Open LibreOffice Calc. "
"Create a new spreadsheet with columns: Date, Description, Amount, Category. "
"Enter 5 sample expense entries. "
"Add a SUM formula at the bottom of the Amount column. "
"Save the file as /tmp/expenses.xlsx."
),
kind="desktop",
environment_id=computer.id, # reuse the environment with LibreOffice installed
max_steps=40,
):
print(event)
// Set up the environment
const computer = await client.computers.create({
kind: "desktop",
persistent: true,
});
await client.computers.exec.sync(computer.id!, {
command: "apt-get install -y libreoffice",
});
await client.computers.delete(computer.id!);
// Run the task
const stream = await client.agent.tasks.startStream({
instruction:
"Open LibreOffice Calc. " +
"Create a new spreadsheet with columns: Date, Description, Amount, Category. " +
"Enter 5 sample expense entries. " +
"Add a SUM formula at the bottom of the Amount column. " +
"Save the file as /tmp/expenses.xlsx.",
kind: "desktop",
environment_id: computer.id!,
max_steps: 40,
});
for await (const event of stream) {
console.log(event);
}

Automate repetitive data entry across a legacy system:

records = [
{"name": "Jane Smith", "email": "jane@acme.com", "role": "Manager"},
{"name": "Bob Chen", "email": "bob@acme.com", "role": "Engineer"},
{"name": "Sara Lee", "email": "sara@acme.com", "role": "Director"},
]
for record in records:
print(f"Creating user: {record['name']}")
for event in client.agent.tasks.start_stream(
instruction=(
f"Go to https://admin.example.com/users/new. "
f"Fill in Name: '{record['name']}', Email: '{record['email']}', Role: '{record['role']}'. "
f"Click Create User. Verify the success message appears."
),
kind="desktop",
max_steps=15,
):
print(f" {event}")
const records = [
{ name: "Jane Smith", email: "jane@acme.com", role: "Manager" },
{ name: "Bob Chen", email: "bob@acme.com", role: "Engineer" },
{ name: "Sara Lee", email: "sara@acme.com", role: "Director" },
];
for (const record of records) {
console.log(`Creating user: ${record.name}`);
const stream = await client.agent.tasks.startStream({
instruction:
`Go to https://admin.example.com/users/new. ` +
`Fill in Name: '${record.name}', Email: '${record.email}', Role: '${record.role}'. ` +
`Click Create User. Verify the success message appears.`,
kind: "desktop",
max_steps: 15,
});
for await (const event of stream) {
console.log(` ${JSON.stringify(event)}`);
}
}
RPA (UiPath, Automation Anywhere)Northstar
SetupWeeks of scripting with visual buildersOne natural language instruction
MaintenanceBreaks on every UI changeAdapts — reads the screen like a human
Desktop appsRequires recording + selectorsWorks on any GUI out of the box
Cost$500K+ enterprise licensesPay per task