A .NET MAUI week-view scheduler control: infinite horizontal paging, drag-and-drop rescheduling, month view, and a drawn grid built from plain MAUI primitives. No XAML, no Blazor, one package reference.
Get Started
| Product | Versions |
|---|---|
| .NET |
README
Owlery.Maui.Scheduler
A .NET MAUI week-view scheduler control, built from plain MAUI primitives — no XAML, no Blazor, and exactly one package reference of its own.
- Infinite horizontal paging through weeks, three days, or a single day, and a month surface.
- Drag-and-drop rescheduling, including across weeks by holding at the edge.
- A drawn grid — hour lines, configurable sub-hour marks, non-working days and hours, today.
- Semantic colours as ordinary bindable properties, so a MAUI
StyleorAppThemeBindingis the theme. - Appointment views are pooled and rebound, never rebuilt.
Getting started
dotnet add package Owlery.Maui.Scheduler
The control needs one line from the host, because MAUI gives a library no way to register a handler for itself:
builder.UseOwleryScheduler();
Then supply appointments and respond to what the user did:
new SchedulerView
{
ItemsSource = appointments, // IEnumerable<ISchedulerAppointment>
AppointmentTemplate = template,
SlotMinutes = 60, // a tap selects a whole hour
DragSnapMinutes = 15, // a drag lands on the quarter
}
VisibleDatesChanged is the data-loading hook: it reports the range on screen plus a prefetch window,
including on first layout.
Documentation
| Document | Answers |
|---|---|
docs/API.md |
The public surface — properties, events, contracts, defaults |
docs/design/ |
Why it is built this way — decisions, alternatives rejected, costs |
docs/requirements/ |
What it does, as behaviour |
AGENTS.md |
How to work on it |
Repository layout
| Project | |
|---|---|
Owlery.Maui.Scheduler |
The control. Targets net10.0, net10.0-android, net10.0-ios. |
Owlery.Maui.Scheduler.Sample |
A bare MAUI playground with a drawer of knobs bound to the public properties. |
Owlery.Maui.Scheduler.Tests |
Headless NUnit tests on net10.0 — no simulator, no device. |
dotnet test Owlery.Maui.Scheduler.Tests/Owlery.Maui.Scheduler.Tests.csproj
dotnet build Owlery.Maui.Scheduler.Sample/Owlery.Maui.Scheduler.Sample.csproj -f net10.0-ios -t:Run
Releasing
Versions come from Nerdbank.GitVersioning
(version.json), so a release on tag v0.1.4 publishes 0.1.4.
Run the Create release tag workflow against a branch or commit. It tags that commit with the version NBGV computes for it and pushes the tag — you never type a version number, so the tag and the package cannot disagree.
Then create a GitHub release on that tag by hand — the GitHub UI, or
gh release create <tag> --generate-notes --verify-tag. Publishing that release runs
.github/workflows/publish-nuget.yml, which builds every target framework, runs the tests, and
pushes the package and symbols to nuget.org.
Creating the release by hand is deliberate. A release created with the built-in GITHUB_TOKEN raises
no event, so the publish workflow would never run, and a PAT would mean keeping a RELEASE_TAG_TOKEN
secret. Using your own identity raises the event without either. Authentication to nuget.org is
Trusted Publishing — the workflow
proves its identity with a short-lived OIDC token, so there is no API key stored anywhere. That also
means the policy on nuget.org names this workflow file: renaming or moving it breaks publishing until
the policy is updated to match.
workflow_dispatch builds and packs without pushing, so the whole pipeline can be exercised before a
real release.
License
MIT — see LICENSE.
Downloads by Version
Similar & Alternative Packages
Hand-picked matching NuGet libraries based on tags & ecosystem
Depended On By
Find packages that declare this package as a dependency. NuGet does not provide a reverse-dependency endpoint, so candidates are checked on demand.
Adoption Assessment
Assess this package against its supported frameworks, license, maintenance signals and dependency graph before making it a project standard.
Related Guides & Workflows
Learn how to evaluate, integrate, or audit this package in your .NET project.