GPAL 1.0.0-rc.1

This is a prerelease version of GPAL.
dotnet add package GPAL --version 1.0.0-rc.1
                    
NuGet\Install-Package GPAL -Version 1.0.0-rc.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="GPAL" Version="1.0.0-rc.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="GPAL" Version="1.0.0-rc.1" />
                    
Directory.Packages.props
<PackageReference Include="GPAL" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add GPAL --version 1.0.0-rc.1
                    
#r "nuget: GPAL, 1.0.0-rc.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package GPAL@1.0.0-rc.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=GPAL&version=1.0.0-rc.1&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=GPAL&version=1.0.0-rc.1&prerelease
                    
Install as a Cake Tool

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 Compatible and additional computed target framework versions.
.NET Framework net48 is compatible.  net481 was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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