Osy#betaRun it on Osyrin: osyrin.com

Reference / Stdlib

The standard library — and where each call runs

The pure standard library, and the one fact about it that changes how your app feels: 271 of its 396 methods run in the BROWSER, with no round trip. The rest that do not are held there by ONE thing — they need a secret the browser must never hold (a signing key, a KMS key, a password hash). Nothing here needs a capability.

stable2 examples compiled by CIstdlibclientserverperformance

Summary#

The standard library is the set of pure calls available in any function body — text, numbers, dates, encoding, hashing. No use, no capability, no ceremony.

The thing worth knowing about it is where each call runs. Osy# decides that for you: a function whose body the browser can execute runs in the browser, and never makes a network call. 271 of the 396 stdlib methods can. So

var label = Text.Upper(name);              // runs in the browser
var price = Convert.ToString(total, "F2"); // runs in the browser
var due   = Date.AddDays(start, 30);       // runs in the browser

…are all free. Write the code; the compiler works out where it can run.

Where each call runs#

The default is the client, and the goal is that it always is. A method is kept on the server only when running it in the browser would give a different or unsafe answer — never because it was hard to port. There is one reason that is a true floor, and a shrinking frontier of methods on their way to the client.

1 — It needs a secret the browser must never hold#

This is the floor — a handful of Security.* and Crypto.* operations, and the only ones that can never move. The client is the user's own machine, so the JWT signing key, the KMS encryption key, an HMAC key and a password hash's cost/salt are precisely the things it must not see. Running these in the browser would not be slow — it would either leak the secret or let the client forge authority (a client-minted token is self-issued). The round trip is the security boundary, not a performance cost.

Security.HashPassword(pw)     // server — the cost factor and the salt RNG are the host's
Security.IssueJwt(claims)     // server — signed with the host's key; a client could forge one
Crypto.Encrypt(secret)        // server — the KMS key never reaches the browser

Host-authoritative randomness sits here too: Security.RandomId / RandomHex must come from the host's RNG, or an "unguessable" id is guessable.

The clock is not one of these, and it is worth saying so directly because it looks like it should be. DurableClock.Now, DurableClock.UtcNow and DateTime.UtcNow run on the client. A DateTime here is a UTC instant, not a wall-clock reading, so a browser and the server name the same value — 9am in Frankfurt is 5pm in Tokyo, the same instant — and reading it in the browser costs no round trip. (Test pinning still works, and a resumed durable function still sees a consistent instant, because this engine resumes from a saved point rather than re-running your function from the top.)

var now  = DurableClock.Now;                        // client — a UTC instant, read in the browser
var due  = Date.AddDays(order.Placed, 30);   // client — pure arithmetic on a value in hand
var year = Date.Year(order.Placed);          // client

2 — The browser cannot yet reproduce it faithfully#

This has shrunk to essentially one case, and it is a specific fidelity gap, not a law of nature: a Double handed to Convert.ToString(value, format) still renders on the server, because .NET produces its digits from the value's exact binary expansion. (Decimal — this platform's money type, and what a format specifier is almost always for — already formats in the browser.)

Everything that used to sit here has moved to the client: WebUtility.HtmlDecode now ports .NET's own algorithm and entity table (not the browser's, which decodes a different set — it accepts &copy without the semicolon where .NET does not); WebUtility.HtmlEncode ships its five-character escape set; and the unkeyed hashes Crypto.Sha256Hex / Crypto.Md5Hex run in the browser too, since neither holds a secret.

Which two calls decide per call site?#

Two methods are not client-or-server by name — the arguments decide, so the same method may run in the browser at one call site and on the server at the next.

Convert.ToString(value, format) — and the $"{total:F2}" that lowers onto it. It runs in the browser when the format is a literal — either a standard specifier (F2, N0, C, P1) or a custom digit pattern ("#,##0.00", "0.00", "00000") — over a Decimal or Int32. A format built at runtime, or a Double, still goes to the server.

var a = Convert.ToString(total, "F2");        // client — literal, standard, decimal
var b = Convert.ToString(total, "#,##0.00");  // client — the compiler parses the pattern into a plan and ships it
var c = Convert.ToString(total, fmt);         // server — a runtime format string the compiler cannot see

A literal custom pattern (b) is a compile-time constant, so the compiler parses it once into a plan — how many digits, whether to group — and ships the plan; the browser executes arithmetic, never a parser (the same trick regular expressions already use). A pattern that reaches past the digit-placeholder core — section separators, scaling, percent, scientific, embedded literals — stays on the server, where .NET renders it correctly.

A v1 boundary worth stating plainly: client-side custom-pattern formatting works only for a compile-time literal pattern, because the mechanism is the compiler parsing it into a plan. A runtime-built format string (c — where the format is a variable) the compiler cannot see, so it stays on the server; today translating it would mean shipping a second .NET-format parser to every browser. That is a v1 limitation, not a permanent one: a future version could ship a small client-side format interpreter so a runtime-built pattern also runs in the browser. Until then, c is a round trip and returns the right string.

JsonSerializer.Serialize and JsonSerializer.Deserialize<T> run in the browser — a scalar, a class, a list, a dictionary, with or without options — and answer what the server answers (JsonSerializer #in-a-page). What the browser needs of the model (a class's members, in order, under their wire names) is sent with the call. A stored row is the exception: its members are read on the server, as the person reading.

Does this change my code?#

No. Where a call runs never changes its answer — the client arms are pinned against the real server by an oracle suite, down to the details C# gets opinionated about (Math.Round(2.5) is 2, half to even, on both sides; Uri.EscapeDataString escapes !'()*, which encodeURIComponent does not).

It changes only how the app feels. A form that formats a price, validates a pattern and computes a due date now does all of it without touching the network. And if you write a function that mixes a client-runnable call with a server-only one, the function simply runs on the server — the answer is still right, it just costs a round trip.

Here is the surface actually running — and the two answers C# has an opinion about, pinned. The client arms are held to exactly these, so the assertions below are true wherever the function ends up running:

// Every call in this body is client-runnable, so the whole function runs in the browser. No annotation, no opt-in.
string PriceLabel(decimal total) {
  return Text.Upper("total") + ": " + Convert.ToString(total, "F2");
}
[Test]
void The_stdlib_gives_the_same_answer_wherever_it_runs() {
  Assert.Equal("TOTAL: 12.50", PriceLabel(12.5m));           // two decimals, not "12.5"
  Assert.Equal("ACME", Text.Upper("acme"));

  // HALF TO EVEN, as in C# — `Math.Round(2.5)` is 2 and `Math.Round(3.5)` is 4. A client that used JS's
  // Math.round would answer 3 for the first, which is how a half-cent walks into an invoice.
  Assert.Equal(2m, Math.Round(2.5m));
  Assert.Equal(4m, Math.Round(3.5m));

  // A literal custom pattern — the money-grid case — runs in the browser too: the compiler parses "#,##0.00"
  // into a plan and ships it. Grouped, two decimals, rounded away from zero on the exact digits.
  Assert.Equal("1,234.57", Convert.ToString(1234.5678m, "#,##0.00"));

  // The deterministic date surface: pure arithmetic on a value already in hand. Runs in the browser.
  var due = Date.AddDays(DateTime.Parse("2026-01-01"), 30);
  Assert.Equal(31, Date.Day(due));
  Assert.Equal(2026, Date.Year(due));
}

Every method, and where it runs#

Generated from the compiler's own allowlist and checked on every build — if a method moves, is added, or is removed, this table fails the build until it is right. It cannot go stale.

235 run on the client · 89 are server-only · 11 decide per call site.

MethodRuns onWhy not the client
Backoff.Capserverbounds a retry policy, which only the durable engine reads
Backoff.Exponentialservera retry policy is read only by the durable engine, which schedules the retry — a client holds nothing that acts on one
Backoff.Fixedservera retry policy is read only by the durable engine, which schedules the retry — a client holds nothing that acts on one
Backoff.Jitterserverbounds a retry policy, which only the durable engine reads
Backoff.Linearservera retry policy is read only by the durable engine, which schedules the retry — a client holds nothing that acts on one
Backoff.MaxAttemptsserverbounds a retry policy, which only the durable engine reads
Bytes.Lengthservertakes byte[] — see Crypto.Sha256
Bytes.Skipservertakes and answers byte[] — see Crypto.Sha256
Bytes.Sliceservertakes and answers byte[] — see Crypto.Sha256
Bytes.Takeservertakes and answers byte[] — see Crypto.Sha256
Colors.Onclient
Convert.AmbientAppFieldclientships as an appField node — the client-safe app identity (Slug / Domain / BaseUrl / Version / PlatformVersion) from the boot app ambient (the internal carrier of App.Slug/Domain/BaseUrl/Version/PlatformVersion)
Convert.AmbientCultureclientships as an ambientCulture / cultureFormatAmbient node — the viewer's culture token from the metadata payload (the internal carrier of Session.CurrentCulture)
Convert.AmbientUserFieldclientships as a currentUserField node — a scalar of the viewer's principal from the boot bag (the internal carrier of Session.CurrentUser fields)
Convert.FromBase64Stringclient
Convert.FromHexStringserveranswers byte[] — see Crypto.Sha256
Convert.ToBase64Stringclient
Convert.ToBoolclient
Convert.ToBooleanclient
Convert.ToDecimal/1client
Convert.ToDecimal/2conditionalgated per call site — a literal declared culture ships as a cultureParse node; a dynamic culture stays server
Convert.ToDoubleclient
Convert.ToHexStringservertakes byte[] — see Crypto.Sha256
Convert.ToHexStringLowerservertakes byte[] — see Crypto.Sha256
Convert.ToInt/1client
Convert.ToInt/2conditionalgated per call site — a literal declared culture ships as a cultureParse (int profile) node; a dynamic culture stays server
Convert.ToInt32/1client
Convert.ToInt32/2conditionalsame as Convert.ToInt/2 — C#'s spelling of the same call, matched by the same gate. The BASE overload Convert.ToInt32(s, 16) (an integer second argument) always ships, as a std: call the client's convert arm dispatches on the argument's type
Convert.ToInt64client
Convert.ToString/1client
Convert.ToString/2conditionalgated per call site — every numeric format ships (any type, any format, literal or runtime); a date format ships only for the supported token set
Convert.ToString/3conditionalgated per call site — a literal supported format + a literal (declared) culture over a Decimal/Int32 ships as a cultureFormat node keyed by token; anything else stays server
Cost.AllocatedKbSinceserverit reads the server process's allocation counter
Cost.Markserverit marks the server's own statement, row and round-trip counters for the current request
Cost.OptimizedBuildserverit reads how the server's platform was built
Cost.RequestsSinceserverit reads the server's count of the requests the test's pages made
Cost.RoundTripsSinceserverit reads the server's round-trip counter for the current request
Cost.RowsReadSinceserverit reads the server's row counters for the current request
Cost.RowsWrittenSinceserverit reads the server's row counters for the current request
Cost.ServerCallsSinceserverit reads the server's count of the server calls the test's pages made
Cost.StatementsSinceserverit reads the server's statement counter for the current request
Crypto.Decryptserverdecryption uses the app's platform-managed KMS key, which the client never holds
Crypto.Encryptserverencryption uses the app's platform-managed KMS key, which the client never holds
Crypto.FixedTimeEqualsservera constant-time compare is only meaningful next to the secret it guards
Crypto.FromHexserveranswers byte[] — see Crypto.Sha256
Crypto.HmacSha256serveran HMAC is keyed with the host's key, which the client must never hold
Crypto.HmacSha256Hexserveran HMAC is keyed; the key is the host's and must not reach the browser
Crypto.Md5Hexclient
Crypto.Sha256serverthe digest itself is already ported as Crypto.Sha256Hex; this overload takes and answers byte[], and the client has no representation of one yet
Crypto.Sha256Hexclient
Crypto.SignEs256serversigning uses a PRIVATE key; a key the browser can observe is a key that has leaked
Crypto.SignRs256serversigning uses a PRIVATE key; a key the browser can observe is a key that has leaked
Crypto.ToHexservertakes byte[] — see Crypto.Sha256; the conversion is trivial, the value type is what is missing
Crypto.VerifyEs256serververification takes a byte[] signature, which the client has no representation of
Crypto.VerifyRs256serververification takes a byte[] signature, which the client has no representation of
CultureInfo.InvariantCultureclient
Date.AddDaysclient
Date.AddHoursclient
Date.AddMicrosecondsclient
Date.AddMillisecondsclient
Date.AddMinutesclient
Date.AddMonthsclient
Date.AddSecondsclient
Date.AddTicksclient
Date.AddYearsclient
Date.Bucketserverit reads a zone's clock that is a setting, not a literal the browser holds a plan for — and it is the twin of the SQL a report groups by
Date.Compareclient
Date.Dateclient
Date.DateTimeclient
Date.Dayclient
Date.DayNumberclient
Date.DayOfWeekclient
Date.DayOfYearclient
Date.GetDateTimeFormats/1client
Date.GetDateTimeFormats/2client
Date.GetDateTimeFormats/3servera named culture's date patterns — the client holds the invariant culture's table only
Date.GetDateTimeFormatsInservera named culture's date patterns — the client holds the invariant culture's table only
Date.GetHashCodeclient
Date.GetTypeCodeclient
Date.Hourclient
Date.Microsecondclient
Date.Millisecondclient
Date.Minuteclient
Date.Monthclient
Date.Nanosecondclient
Date.Offsetclient
Date.Secondclient
Date.Ticksclient
Date.TimeOfDayclient
Date.ToDateTimeclient
Date.ToTimeSpanclient
Date.ToFileTimeUtcclient
Date.ToOADateclient
Date.ToOffsetclient
Date.ToUniversalTimeclient
Date.ToUnixTimeMillisecondsclient
Date.ToUnixTimeSecondsclient
Date.UtcDateTimeclient
Date.Yearclient
DateOnly.FromDateTimeclient
DateOnly.FromDayNumberclient
DateOnly.MaxValueclient
DateOnly.MinValueclient
DateOnly.Newclient
DateOnly.Parseclient
DateTime.Combineclient
DateTime.Compareclient
DateTime.DaysInMonthclient
DateTime.FromBinaryclient
DateTime.FromFileTimeUtcclient
DateTime.FromOADateclient
DateTime.FromTicksclient
DateTime.IsLeapYearclient
DateTime.MaxValueclient
DateTime.MinValueclient
DateTime.Newclient
DateTime.NewMsclient
DateTime.NewUsclient
DateTime.Nowclient
DateTime.Parse/1client
DateTime.Parse/2servera named culture's lenient date parse — the client reproduces ParseExact over a culture, not .NET's pattern search
DateTime.Parse/3servera named culture's lenient date parse, with styles — the client reproduces ParseExact over a culture, not .NET's pattern search
DateTime.ParseExactconditionalgated per call site — the invariant culture with a formats array ships as a std call; a named culture stays server
DateTime.SpecifyKindclient
DateTime.Todayclient
DateTime.UnixEpochclient
DateTime.UtcNowclient
DateTimeOffset.FromUnixTimeMillisecondsclient
DateTimeOffset.FromUnixTimeSecondsclient
DateTimeOffset.Nowclient
DateTimeOffset.Parseclient
DateTimeOffset.UnixEpochclient
DateTimeOffset.UtcNowclient
DurableClock.Nowclient
DurableClock.Todayclient
DurableClock.UtcNowclient
Encoding.GetEncodingclient
Enum.Descriptionclientmodel-backed; ships as std:Enum.Description, dispatched by the client's dedicated arm
Enum.Labelclientmodel-backed; ships as std:Enum.Label, dispatched by the client's dedicated arm over the enum map
Enum.Nameclientmodel-backed; ships as std:Enum.Name, dispatched by the client's dedicated arm
Enumerable.Rangeclient
Enumerable.Repeatclient
Enumerable.Sequenceclient
Environment.GetEnvironmentVariableclientlowered to Convert.AmbientEnvironmentVariable, which ships as a configField node
Environment.NewLineclientlowered by the resolver to the literal "\n"
File.SignedUrlservera signed URL is a bearer capability sealed with the app's platform-managed key; the client must never be able to mint one, so it is signed on the server and shipped as a value
File.Urlclientships as fileUrl — the render evaluator builds the URL in-process
Geography.Parseclient
Geography.Pointclient
Guid.Emptyclient
Guid.NewGuidclient
Guid.Parseclient
JsonSerializer.Serializeconditionalgated by CanJsonSerializeOnClient — everything but a stored row, an interface and an abstract class ships, with its shape; the options form is gated the same way
Math.Absclient
Math.Acosclient
Math.Asinclient
Math.Atanclient
Math.Atan2client
Math.Ceilclient
Math.Ceilingclient
Math.Clampclient
Math.Cosclient
Math.Expclient
Math.Floorclient
Math.Logclient
Math.Log10client
Math.Log2client
Math.Maxclient
Math.Minclient
Math.Powclient
Math.Roundclient
Math.Signclient
Math.Sinclient
Math.Sqrtclient
Math.Tanclient
Math.Truncateclient
Mime.Buildserverit answers the message's bytes, a byte[] the client has no representation of; mail is sent from the server
Mime.Parseservera message's bytes are a byte[], which the client has no representation of; mail is received on the server
Path.AltDirectorySeparatorCharclient
Path.ChangeExtensionclient
Path.Combineclient
Path.DirectorySeparatorCharclient
Path.EndsInDirectorySeparatorclient
Path.GetDirectoryNameclient
Path.GetExtensionclient
Path.GetFileNameclient
Path.GetFileNameWithoutExtensionclient
Path.GetFullPathclient
Path.GetInvalidFileNameCharsclient
Path.GetInvalidPathCharsclient
Path.GetPathRootclient
Path.GetRelativePathclient
Path.HasExtensionclient
Path.IsPathFullyQualifiedclient
Path.IsPathRootedclient
Path.Joinclient
Path.PathSeparatorclient
Path.TrimEndingDirectorySeparatorclient
Path.VolumeSeparatorCharclient
Qr.Encodeserverthe encoder is native to the server, where the text a code carries is usually made (a provider's frame derived from a secret); the page is sent the rows
Random.Nextclient
Records.FieldNameserverit reads the field a selector names off the selector's compiled body, which the server holds
Records.IsAserverthe type hierarchy is read off the model the server holds
Records.Linkservera record's link is the page that [Opens] it, which the server compiled
Records.MayReadserverit evaluates another principal's security rules against a row, which only the server holds
Records.Nounservera record's noun is read off the model the server holds
Records.Readableserverit evaluates another principal's security rules against rows, which only the server holds
Records.RollsUpToserverwhat a record rolls up to was compiled into the server's model
Records.Textserverit reads the type of the field a selector names off the selector's compiled body, which the server holds
Records.Timeserverit reads a field by name off the model the server holds
Records.Titleservera record's title is what its [Title] declared, which the server compiled
Records.Typeservera record's type is read off the model the server holds
Records.Valueserverit reads a field by name off the model the server holds
Regex.IsMatchclientships as regexIsMatch, with the pattern translated to JS's dialect at compile time
Regex.Replaceclientships as regexReplace, with the pattern translated to JS's dialect at compile time
Regex.Splitclientships as regexSplit, with the pattern translated to JS's dialect at compile time
Request.ClientAddressserverthe caller's address is what the server that received the request sees; the browser does not know its own public address
Request.Headerserveran inbound request header exists only on the server that received it; the browser is the sender, not the receiver
Request.OidcClaimserveran inbound bearer token is verified only on the server that received it; the browser is the sender, not the receiver
Request.OidcEmailserveran inbound bearer token is verified only on the server that received it; the browser is the sender, not the receiver
Request.Queryserveran inbound request's query string exists only on the server that received it; the browser is the sender, not the receiver
Request.RawBodyserveran inbound request body exists only on the server that received it; the browser is the sender, not the receiver
Security.CurrentUserIdserverwho is acting is the server's to say — it is the principal the request was authenticated as, which a browser could only claim
Security.EndOtherSessionsserverit ends the account's other sessions in the platform's ticket store when the unit of work commits — an act only the server can perform
Security.Fingerprintservera fingerprint is keyed by the app's key, which lives with the host — a browser that could compute one would be holding the key
Security.HashApiKeyserveran API key is hashed where it is stored and checked — on the server
Security.HashPasswordserverpassword hashing runs where the host's cost factor and salt RNG live
Security.IsMaskedclientstore-backed; ships as std:Security.IsMasked, answered by the client's dedicated arm from the withheld-members list each row carries
Security.IsSecretSetserverwhether a secret is configured is a fact about the server's secret store, which the browser cannot read and should not be told about
Security.IssueJwtservera JWT is signed with the host's key; a client-minted token would be self-issued authority
Security.LinkOAuthFromPendingserverwriting the OAuth identity link is a server-authority write (and the sealed provider subject never reaches the client)
Security.MayReadserverit evaluates another principal's security rules against a row, which only the server holds
Security.NewApiKeyserveran API key must come from the host's RNG, and it is shown once from the server
Security.OAuthConnectUrlserverstarting a connection seals state with the app's own key and names one of its secrets — the server does it, and the page navigates to the URL it answers
Security.OAuthLinkedProvidersserverthe identity links are the platform's own rows, read on the server
Security.PendingOAuthAccountCreatedAtserverthe account's age is a provider fact the platform measured and sealed; a client that could open it could claim any age
Security.PendingOAuthLinkedUserserverthe pending-oauth token is sealed with the app's platform-managed key, and the link it is matched against is the platform's own row; only the server can say which account a provider identity signs in to
Security.PendingOAuthLoginserverthe pending-oauth token is sealed with the app's platform-managed key; only the server can open it to read the provider's handle for the account
Security.PendingOAuthNameserverthe pending-oauth token is sealed with the app's platform-managed key; only the server can open it to read the name the provider gave
Security.PendingOAuthProviderserverthe pending-oauth token is sealed with the app's platform-managed key; only the server can open it to say which provider verified this identity
Security.RandomHexserveran unguessable value must come from the host's RNG, not the user's machine
Security.RandomIdserveran unguessable id must come from the host's RNG, not the user's machine
Security.SignInProvidersserverthe declared OAuth clients are the app's configuration on the server; a page asks a server function for them
Security.SignOutEverywhereserverit ends sessions, which the server keeps
Security.SignedInElsewhereserverit reads the person's other sessions, which the server keeps
Security.UnlinkOAuthserverremoving an identity link is a server-authority write to the platform's own row
Security.VerifyPasswordserverpassword verification runs where the hash does — the client never sees a hash
Security.VerifyPendingOAuthEmailserverthe pending-oauth token is sealed with the app's platform-managed key; only the server can open it to read the provider-verified email
TestOAuth.PendingTokenserverit mints the platform-sealed pending-oauth token; the sealing key is the host's, so only the server can produce one
TestOidc.Bearerserverit stands in for a bearer token the server verified on an inbound request; only the server receives one
TestOidc.Claimserverit stands in for a bearer token the server verified on an inbound request; only the server receives one
Text.ByteSizeclient
Text.Capitalizeclient
Text.Cloneclient
Text.CompareToclient
Text.Concatclient
Text.Containsclient
Text.EndsWithclient
Text.Equalsclient
Text.FromBytesservertakes byte[] — see Crypto.Sha256
Text.FromCharsclient
Text.GetHashCodeclient
Text.GetTypeCodeclient
Text.IndexOfclient
Text.IndexOfAnyclient
Text.IndexOfModeclient
Text.Insertclient
Text.IsBlankclient
Text.IsEmptyclient
Text.IsNormalizedclient
Text.Joinclient
Text.LastIndexOfclient
Text.LastIndexOfAnyclient
Text.LastIndexOfModeclient
Text.Leftclient
Text.Lengthclient
Text.Likeclient
Text.Lowerclient
Text.Normalizeclient
Text.PadEndclient
Text.PadStartclient
Text.Removeclient
Text.Repeatclient
Text.RepeatCharclient
Text.Replaceclient
Text.ReplaceLineEndingsclient
Text.Reverseclient
Text.Rightclient
Text.Splitclient
Text.SplitOptionsclient
Text.StartsWithclient
Text.Substringclient
Text.TitleCaseclient
Text.ToBytesserveranswers byte[] — see Crypto.Sha256. It is the usual FIRST call of a byte chain, so its absence is what an author meets first
Text.ToCharArrayclient
Text.Trimclient
Text.TrimEndclient
Text.TrimStartclient
Text.Truncateclient
Text.Upperclient
TimeOnly.FromDateTimeclient
TimeOnly.FromTimeSpanclient
TimeOnly.MaxValueclient
TimeOnly.MinValueclient
TimeOnly.Newclient
TimeOnly.Parseclient
TimeSpan.Daysclient
TimeSpan.FromDaysclient
TimeSpan.FromHoursclient
TimeSpan.FromMillisecondsclient
TimeSpan.FromMinutesclient
TimeSpan.FromSecondsclient
TimeSpan.FromTicksclient
TimeSpan.Hoursclient
TimeSpan.MaxValueclient
TimeSpan.MinValueclient
TimeSpan.Minutesclient
TimeSpan.Newclient
TimeSpan.Parseclient
TimeSpan.Secondsclient
TimeSpan.Ticksclient
TimeSpan.TotalDaysclient
TimeSpan.TotalHoursclient
TimeSpan.TotalMillisecondsclient
TimeSpan.TotalMinutesclient
TimeSpan.TotalSecondsclient
TimeSpan.Zeroclient
Totp.Codeservera code is made from the secret, which the browser must never hold
Totp.NewSecretservera second factor's secret must come from the host's RNG, not the user's machine
Totp.Uriserverthe address carries the secret; it is made on the server beside it, and the page is sent the QR rows
Totp.Verifyserverchecking a code needs the secret it proves possession of, which the browser must never hold
Uri.EscapeDataStringclient
Uri.SchemeDelimiterclient
Uri.UriSchemeFileclient
Uri.UriSchemeFtpclient
Uri.UriSchemeHttpclient
Uri.UriSchemeHttpsclient
Uri.UriSchemeMailtoclient
Uri.UriSchemeWsclient
Uri.UriSchemeWssclient
Uri.UnescapeDataStringclient
WebAuthn.CreationOptionsserverthe options carry a challenge the server minted and keeps; the page is sent them
WebAuthn.CredentialIdserverit reads an answer only the server acts on; the page hands the answer over whole
WebAuthn.NewTestKeyserverthe authenticator's half is for tests, which run on the server; a browser has its own authenticator
WebAuthn.Registerservera passkey is accepted by the server it will sign in to — a page checking its own answer proves nothing
WebAuthn.RequestOptionsserverthe options carry a challenge the server minted and keeps; the page is sent them
WebAuthn.TestCreateserverthe authenticator's half is for tests, which run on the server; a browser has its own authenticator
WebAuthn.TestCredentialIdserverthe authenticator's half is for tests, which run on the server; a browser has its own authenticator
WebAuthn.TestGetserverthe authenticator's half is for tests, which run on the server; a browser has its own authenticator
WebAuthn.Verifyservera sign-in is checked by the server it signs in to — a page checking its own answer proves nothing
WebUtility.HtmlDecodeclient
WebUtility.HtmlEncodeclient
Zip.Listserverit reads an archive's bytes, a byte[] the client has no representation of; a page is sent the listing
TimeZoneInfo.BaseUtcOffsetconditionalships as a zoneInfo node — read off the zone's plan, which carries the server's answer
TimeZoneInfo.ConvertTimeFromUtcconditionalships as an inZone node — a literal zone as its token, a zone value as its expression
TimeZoneInfo.ConvertTimeToUtcconditionalships as a zoneToUtc node — a literal zone as its token, a zone value as its expression
TimeZoneInfo.DisplayNameconditionalships as a zoneInfo node — read off the zone's plan, which carries the server's answer
TimeZoneInfo.FindSystemTimeZoneByIdclient
TimeZoneInfo.GetUtcOffsetconditionalships as a zoneOffsetAt node — a literal zone as its token, a zone value as its expression
TimeZoneInfo.Idclient
TimeZoneInfo.IsAmbiguousTimeconditionalships as a zoneIsAmbiguous node — a literal zone as its token, a zone value as its expression
TimeZoneInfo.IsDaylightSavingTimeconditionalships as a zoneIsDst node — a literal zone as its token, a zone value as its expression
TimeZoneInfo.IsInvalidTimeconditionalships as a zoneIsInvalid node — a literal zone as its token, a zone value as its expression
TimeZoneInfo.SupportsDaylightSavingTimeconditionalships as a zoneInfo node — read off the zone's plan, which carries the server's answer
TimeZoneInfo.Utcclient
bool.Parseclient
char.IsDigitclient
char.IsLetterclient
char.IsLetterOrDigitclient
char.IsLowerclient
char.IsPunctuationclient
char.IsUpperclient
char.IsWhiteSpaceclient
char.Parseclient
char.ToLowerclient
char.ToStringclient
char.ToUpperclient
decimal.Parse/1client
decimal.Parse/2conditionalgated per call site — a literal or the viewer's culture ships as a culturePrimitiveParse node; a culture in a variable stays server
double.IsFiniteclient
double.IsInfinityclient
double.IsNaNclient
double.IsNegativeInfinityclient
double.IsPositiveInfinityclient
double.Parse/1client
double.Parse/2conditionalgated per call site — a literal or the viewer's culture ships as a culturePrimitiveParse node; a culture in a variable stays server
int.Parse/1client
int.Parse/2conditionalgated per call site — a literal or the viewer's culture ships as a culturePrimitiveParse node; a culture in a variable stays server
long.Parse/1client
long.Parse/2conditionalgated per call site — a literal or the viewer's culture ships as a culturePrimitiveParse node; a culture in a variable stays server
string.Compareclient
string.CompareOrdinalclient
string.Concatclient
string.Equalsclient
string.Internclient
string.IsNullOrEmptyclient
string.IsNullOrWhiteSpaceclient
string.Joinclient

See also#

Related

Regex

Match, replace, split and CAPTURE with regular expressions — the C#-faithful System.Text.RegularExpressions spelling…

Security.* — hashing, verifying, tickets, random ids

The calls an authentication flow needs: `HashPassword` (salted, one-way), `VerifyPassword` (constant-work comparison…

Encoding — Base64, hex, text encodings, URL, HTML

Encode and decode text — Base64, URL percent-encoding, and HTML escaping — with the C#-faithful spellings…

Uri

Parse a URL into its parts with the C#-faithful `new Uri(url)` handle. Construct it from a URL string, then read…