GPAL 1.0.0-rc.1
dotnet add package GPAL --version 1.0.0-rc.1
NuGet\Install-Package GPAL -Version 1.0.0-rc.1
<PackageReference Include="GPAL" Version="1.0.0-rc.1" />
<PackageVersion Include="GPAL" Version="1.0.0-rc.1" />
<PackageReference Include="GPAL" />
paket add GPAL --version 1.0.0-rc.1
#r "nuget: GPAL, 1.0.0-rc.1"
#:package GPAL@1.0.0-rc.1
#addin nuget:?package=GPAL&version=1.0.0-rc.1&prerelease
#tool nuget:?package=GPAL&version=1.0.0-rc.1&prerelease
GPAL
One fluent language for browsers, desktop applications, REST, AI and data. In the same workflow.
Most automation forces you to pick a lane. A browser tool cannot touch the accounting application you have to paste the numbers into. A desktop tool cannot log into the site the numbers come from. So the real work, the part that spans both, ends up as glue nobody wants to maintain.
GPAL is one library, one syntax, and no lanes.
IGPALGrid<string> rows = GPAL.Grid.ToGPALObject();
// read a site
GPAL.Browser
.WithBrowserType(BrowserType.Chrome)
.GoTo("https://example.com/orders")
.WithSelector(orderNumber)
.WithSelector(orderTotal)
.WithAllThatMatch()
.GetGrid(ref rows)
.SaveTo(@"C:\work\orders.csv");
// then drive the program that has to receive it, the same way
GPAL.Application
.WithParameter(@"C:\work\orders.csv")
.Open(@"C:\Program Files\Accounts\accounts.exe")
.WithSelector(importButton)
.LeftClick();
Same verbs on both sides. WithSelector, LeftClick, GetGrid, SaveTo, CallIfFound. Learn it once.
Why it is different
Seven automation engines, one API. Selenium, Puppeteer, and a Puppeteer port built into GPAL that needs no driver download at all, across Chrome, Edge and Firefox. Change the engine, not the workflow.
A real browser nobody can see. WithHiddenDesktop() runs a genuine headful browser, real rendering,
real fingerprint, on a Windows desktop object of its own. It never appears on your screen, never steals
your focus, never eats your keystrokes. That is not headless, which is a different binary that renders
differently and is exactly what detection looks for. Programs can run there too, so a whole workflow can
happen on a machine you are still using.
Desktop automation that is not an afterthought. UIAutomation with a path syntax that reads like XPath, grid reads straight out of a list view, drag and drop, file dialogs answered without keystrokes, and MSAA underneath for the controls Windows never modernized.
Units of work. A selector, the things that narrow it, and the action that spends it. The chain reads as one sentence and GPAL knows where one piece of work ends and the next begins.
Nothing is written without you asking. GPAL creates no log files, no telemetry, no phone-home. Every operation publishes a structured event, and what you attach decides where it goes: a console, a logger, a database, or a handler of your own that inspects the context and stops the run.
GPAL.WithInformationHandler((sender, e) => Console.WriteLine($"[{e.GPALEventType}] {e.Message}"))
.WithExceptionHandler((sender, e) => e.ScreenShot?.Save("what-went-wrong.png"));
Getting started
dotnet add package GPAL
.NET Framework 4.8. Add the optional GPALRestAPI and the OttoMagic browser extension for REST driven browser automation and smarter element detection, and OttoMatic to record a workflow by doing it once.
Full documentation, tutorials and the API reference: https://gpal.sditx.com/
Credits
GPAL was conceived, architected, and primarily implemented by Michael B. Vederman, CEO of Software Decisions, Inc.
Related products developed under Software Decisions, Inc.:
- OttoMatic GPAL browser recorder: Developed by Michael B. Vederman.
- OttoMatic Desktop GPAL application recorder: Developed by Michael B. Vederman.
- OttoMagic GPAL browser REST API executor: Developed by Scott Ramirtha.
- GPALRestAPI: Developed by Michael B. Vederman.
- GPAL Studio: Developed by Bryan Alvarez Pandozi.
License
GPAL is source available under the Business Source License 1.1, with an Additional Use Grant that permits production use, including commercial, internal, hosted and revenue generating, provided you are not offering GPAL itself to third parties as a competing product or service.
On the Change Date, the earlier of January 1 2031 or four years after a version is first distributed, it becomes GPL v3.0 or later. Full terms, including the Additional Use Grant and the Continuity Guarantee: EULA.md.
Copyright © 2026 Software Decisions, Inc. All rights reserved.
This repository is a read only public release mirror. Development happens privately, and pull requests are not accepted here.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET Framework | net48 is compatible. net481 was computed. |
-
.NETFramework 4.8
- BouncyCastle.Cryptography (>= 2.6.2)
- ClosedXML (>= 0.105.0)
- HtmlAgilityPack (>= 1.12.4)
- MailKit (>= 4.17.0)
- Microsoft.OpenApi.Readers (>= 1.6.29)
- MimeKit (>= 4.17.0)
- Nager.PublicSuffix (>= 2.4.0)
- Newtonsoft.Json (>= 13.0.4)
- OpenCvSharp4 (>= 4.13.0.20260627)
- OpenCvSharp4.Extensions (>= 4.13.0.20260627)
- OpenCvSharp4.runtime.win (>= 4.13.0.20260627)
- ReverseMarkdown (>= 6.0.0)
- Selenium.Support (>= 4.26.0)
- Selenium.WebDriver (>= 4.26.0)
- System.IO.Compression.ZipFile (>= 4.3.0)
- System.Text.Json (>= 10.0.10)
- System.ValueTuple (>= 4.6.2)
- YamlDotNet (>= 18.1.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0-rc.1 | 45 | 9/23/2026 |