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.
Install
| 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 |
|---|---|
API.md |
The public surface — properties, events, contracts, defaults |
DESIGN.md |
Why it is built this way — decisions, alternatives rejected, costs |
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 workflow against a branch or commit. It tags that commit with the version NBGV computes for it and publishes a GitHub release on the tag — you never type a version number, so the tag and the package cannot disagree.
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 needs a RELEASE_TAG_TOKEN secret holding a PAT with contents: write. The
built-in GITHUB_TOKEN will not do: GitHub suppresses the events it raises, so the release would
appear and nothing would publish. Creating a release by hand — gh release create, or the GitHub UI —
works without the secret, because that is your identity rather than the Actions token. Authentication 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.
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.