The first time your workflow runs in a given directory, GPAL.yaml does not exist, so GPAL creates it next to your executable with default settings and publishes a warning event. On every run after that, GPAL loads it automatically and confirms with an info event. GPAL.yaml holds the same settings you can configure in code -- match thresholds, typing delays, driver behavior. Call GPAL.SaveSettings() to persist runtime changes back to disk. Both LoadSettings() and SaveSettings() accept an optional GPALFile: pass one to redirect to a different path, and that path becomes the session default for all subsequent no-arg calls.
GPAL
// First run: GPAL
// Every later run: loads GPAL
GPAL
// the download timeout belongs to a browser, so it is set where the browser is built
GPAL
GPAL
// Load from a shared location
// All subsequent no-arg SaveSettings() calls use this path automatically
GPAL
Call GPAL.LoadSettings() with a GPALFile early in your workflow to point GPAL.yaml at a shared or environment-specific location. That path becomes the session default -- subsequent no-arg LoadSettings() and SaveSettings() calls use it automatically for the rest of the run.
Beyond GPAL.yaml, a small set of optional config files can be written to disk when you want to tune behavior without recompiling. All four classes follow the same pattern: Load() and Save() accept an optional GPALFile. With no argument, each uses its own default path next to your executable. Pass a GPALFile to redirect to a different path -- that path becomes the new in-session default.
// the mail object first, then the server settings and the envelope on it
IGPALMail mail = GPAL
// No-arg: each class uses its own default path
CredentialsConfig creds = CredentialsConfig
CredentialsConfig
// Pass a GPALFile to redirect
creds = CredentialsConfig
"config/creds
creds
CredentialsConfig
CredentialsConfig
// Same pattern for DigestRulesConfig and AIProvidersConfig
DigestRulesConfig
DigestRulesConfig
// GPALMail uses
mail
mail
mail
// AIProvidersConfig
AIProvidersConfig providers = AIProvidersConfig
providers
Passing a GPALFile becomes the new session default for all subsequent no-arg calls, and Load never writes to disk. LLMDigestRules.yaml is the one that rewrites itself: an older single section file is migrated to the two section format, and the original is copied to LLMDigestRules.yaml.v0.bak first. A second migration numbers itself .v0.1.bak rather than writing over the first, so nothing is lost.
Nothing below is a setting you turn on. Each one is written because a workflow asked for something that needs it. GPAL.Logger writes log files wherever WithRootDirectory points, in the folder shape WithDirectoryStructure chooses, and it only exists once a workflow builds one: no logger, no log files. A driver GPAL downloads for you lands in the driver location, the archive and the binary both. A workflow that names no profile gets a throwaway one built under the temp directory and removed when the browser closes, and a workflow that names a real profile has that profile written to: Chrome preferences, or user.js on Firefox, put back once the browser process has gone. A hidden desktop writes GPALReturnToDefaultDesktop.ps1 beside the binary, because a desktop nobody can see needs a way back that does not depend on the workflow still running. GPALRestAPI keeps ports-in-use.log beside its own exe, a line of pid and port per running host, so several browsers at once can be told apart. It is written for reading, not by GPAL: a host takes whichever port the operating system gives it and never consults the file.
// a logger is the only reason GPAL writes a log
GPAL
// every event published anywhere in the workflow now lands there too
GPAL
Stealth patching edits the browser executable in place to take out automation fingerprints, and copies the original to the same path with .org on the end first. That copy is how the browser goes back to what it was, so it is not a temporary file and removing it is not tidying up. The patch is applied once and later runs recognize it and leave it alone. Nothing else GPAL writes touches an installed program.
Showing off some plain text in these paragraphs eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Here you can find different accents and emphasis sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
This is a link and how it could look like bestlinkinthebeautifulworld. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Here's just some classic bold text adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam notBoldSecondbestlinkinthebeautifulworld illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Obcaecati, iste distinctio veritatis eligendi laboriosam adipisicing elit illo nostrum corporis at adipisicing elit libero vel voluptas? Expedita, adipisicing facere dolores voluptatem ad ab rem assumenda soluta!
Other cuple of colors in case we want to emphasize several ways adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam adipisicing elit illo nostrum corporis at voluptatem libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta! Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quod veniam, quam ad expedita laborum sed at voluptates culpa ipsam ut vel. Ullam temporibus a mollitia quod aliquam ratione exercitationem nesciunt.
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta! Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quod veniam, quam ad expedita laborum sed at voluptates culpa ipsam ut vel. Ullam temporibus a mollitia quod aliquam ratione exercitationem nesciunt.
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Repudiandae quas consequuntur illo numquam assumenda autem exercitationem distinctio perspiciatis in natus. Eius dicta similique ipsam ipsa minima, nemo quae enim tempore.
GPAL
.CallIfNotFound(GenericCallIfNotFound)
.WithPublishToConsole();
//System.Drawing.Rectangle windowSize = new System.Drawing.Rectangle(10, 10, 1500, 1024);
// NOTE: we have to set browser = before we execute any steps
// this is due to the 'GenericCallIfNotFound' which might throw an exception, and BankScraper will not have the browser set when it calls scraper.Close()
// until the complete fluent line gets executed (meaning every step, meaning browser is not set until everything else succeeds)
browser = GPAL.Browser
.WithBrowserType(Enums.BrowserType.Chrome)
.WithProfileDataDirectory(ChromeProfileLocation)
.WithUseAutomationEngine(AutomationEngine.Selenium)
.WithWindowSize(new System.Drawing.Rectangle(0,0,1920,1080))
.ToGPALObject();