Skip to content
StarLive demo →
CompareChecked against main · 31 Oct 202610 min read

AppointMe vs ABP

ABP is a .NET application framework with an LGPL core and commercial tiers. AppointMe is an MIT .NET 10 SaaS template with no framework layer. They differ on tenancy, auth, UI and licensing.

ABP is
An application framework with commercial tiers
Open source
LGPL-3.0 framework, free basic modules
AppointMe is
An MIT template; all code is yours
Pick ABP if
You want vendor support and many modules

ABP is a framework you build on through its packages; AppointMe is a template whose code you copy and own.

AppointMe ABP
Architecture Modular monolith, vertical slices. 4 modules, each with its own DbContext, schema and .Contracts project. Plain ASP.NET Core minimal APIs. A framework consumed as NuGet and NPM packages. Modules derive from AbpModule. Single-layer, layered, modular-monolith and microservice templates (microservice needs a Business license or higher).
Multi-tenancy One shared database with a CompanyId on every row. The company comes from the X-Company-Id header, and one user can belong to several companies. Built in. IMultiTenant entities are filtered automatically. Tenant from claims, query string, route, header or cookie (__tenant), with domain resolution opt-in. Shared, per-tenant or hybrid databases; managing tenant connection strings from the UI needs the PRO SaaS module.
Auth OIDC with Keycloak locally and Entra External ID on Azure. JWT Bearer for the API, cookies for browser flows. Identity and Account modules with an OpenIddict auth server inside your app. Social logins are free; email confirmation, two-factor and impersonation come with Account Pro.
Permissions Permission fields auto-discovered from code, 4 built-in roles, per-company role overrides. PermissionDefinitionProvider classes, auto-discovered. Granted to a user, role or client, scoped to host or tenant, and tied to features.
Data access EF Core 10 for writes, Dapper for reads. SQL Server. EF Core (SQL Server, MySQL, PostgreSQL, Oracle, SQLite) or MongoDB, behind repositories and a unit of work. Dapper integration available.
Messaging Wolverine 6: domain events and handlers on durable local queues in SQL Server. Azure Service Bus by config. Local and distributed event buses. RabbitMQ, Kafka, Azure Service Bus or Rebus, with outbox and inbox for EF Core and MongoDB.
Frontend One React 19 SPA: TypeScript 6, Vite+, Tailwind 4, shadcn/ui, TanStack Query, with a client generated by orval. MVC/Razor Pages, Angular and Blazor, plus MAUI and React Native for mobile; some options need a license. A React UI with shadcn/ui for license holders. LeptonX Lite theme free.
Local dev Aspire runs SQL Server, Keycloak, Mailpit, the API and the SPA. compose.yaml as an alternative. ABP Studio (desktop) and ABP CLI. Aspire integration is documented for the microservice template.
Deploy Bicep for Azure App Service, Azure SQL and Key Vault. GitHub Actions with OIDC. General guidance: SSL, OpenIddict, clustering, reverse proxies. “Deploying an ABP application is not different than deploying any .NET or ASP.NET Core application.”
Tests 221 xUnit unit tests, with no database or HTTP host. Templates include Domain, Application, EF Core and Web test projects (xUnit, NSubstitute, Shouldly).
Docs This site, about 50 pages. Versioned docs at abp.io/docs (10.7 is current), plus samples and community articles.
License MIT. A PRO add-on is planned. Framework LGPL-3.0. Commercial licenses (Team, Business, Enterprise, Personal) are perpetual and per developer. Team and up include a year of updates.
Maintainers and community One main maintainer (BravoDev). About 50 GitHub stars. Public since June 2026. The Volosoft core team, more than 300 contributors and about 14.5k stars. Public since 2016. Premium support for license holders.
Live demo One click, no sign-up. A hosted demo at abp.io/demo after you sign in with a free ABP account.

AppointMe facts are from commit 2ccbe87. ABP facts are from abp.io and the abpframework/abp repository, ABP 10.7 (see Sources).

AppointMe gives you less, but every line is yours, MIT-licensed, and readable without learning a framework first.

  • No framework layer. Your code uses ASP.NET Core, EF Core, Wolverine and Dapper directly, with no AbpModule or ApplicationService base classes to learn. You take upstream changes as git merges instead of framework upgrades. See Take updates from upstream.
  • MIT, all of it. The React UI, sign-up with email verification and the full local stack are in the free repo. In ABP, the React UI, email confirmation and two-factor in the Account module, and the SaaS module are license-holder features.
  • A React SPA with a generated client. orval turns the OpenAPI document into TypeScript types and TanStack Query hooks, so a contract change breaks the build, not production. See Typed API client.
  • One command for the whole stack. Aspire starts SQL Server, Keycloak, Mailpit, the API and the SPA, applies migrations and seeds demo data. ABP documents Aspire for its microservice template, which needs a Business license or higher. See Quick start.
  • An Azure deploy you can follow. Bicep, Entra External ID and GitHub Actions with OIDC are documented step by step. ABP’s own deployment page says its “documentation doesn’t contain much information on deployment”. See Deploy overview.
  • Small enough to read. Four modules, two of which (CRM and Booking) are examples you can remove. The live demo needs no account.

ABP is a mature, company-backed platform with far more modules, UI choices and tenancy options than AppointMe.

  • Track record and support. Public since 2016 and maintained by the Volosoft team, with frequent releases (10.7.1 shipped on 3 Nov 2026, and 11.0 is in RC). License holders get a premium forum, and Enterprise adds private tickets and email. AppointMe has one main maintainer and no paid support yet.
  • Modules for most SaaS needs. Free: Identity, Account, Tenant Management, OpenIddict, CMS Kit, Blogging and Docs. PRO adds SaaS (editions), Payment, Chat, File Management, Forms, GDPR, an audit-log UI, and text-template and language management.
  • Deeper tenancy. Shared, per-tenant or hybrid databases, several tenant resolvers, and a host side for data that belongs to no tenant. Features, and editions in the PRO SaaS module, can switch permissions off. AppointMe has one shared database and no editions.
  • UI and database choice. Angular, Blazor, MVC, MAUI and React Native (some need a license), and EF Core on SQL Server, MySQL, PostgreSQL, Oracle or SQLite, or MongoDB. AppointMe is React and SQL Server only.
  • Finer permission grants. A permission can be granted to a single user, a role or an OAuth client. AppointMe grants by role only, with per-company overrides.
  • Tooling. ABP Studio, ABP CLI, and ABP Suite, a CRUD page generator for license holders. AppointMe has no CRUD or slice generator.
  • A microservice path. A microservice template with Aspire (Business license or higher), and distributed event buses on RabbitMQ, Kafka, Azure Service Bus or Rebus. AppointMe is a monolith; splitting a module out is on you.
Why a template instead of a framework?2 min · optional

A framework gives you fixes and features by bumping a package version. In return, your code depends on its abstractions, and each major release comes with a migration guide to work through.

A template gives you the code itself. Nothing sits between you and ASP.NET Core, so the docs you need are mostly Microsoft’s and the libraries’. The trade-off is that you own every fix: AppointMe updates reach you as git merges, not package bumps.

If you want someone else to maintain identity, tenancy and admin UIs for years, that’s what ABP’s commercial tiers sell.

Decide on how much you want to own: ABP if you want a vendor and a module catalog, AppointMe if you want a small MIT codebase with no framework dependency.

Choose ABP if… Choose AppointMe if…
You want vendor support and a long-lived roadmap You’re comfortable owning the code and its upgrades
You need editions, per-tenant databases or a host admin side Shared-database tenancy with multi-company users fits
Your team builds in Angular, Blazor or MVC Your team builds in React and TypeScript
You want ready modules: payments, chat, files, CMS, GDPR You’d rather build only the modules you need
You want a CRUD generator (ABP Suite) You’re happy writing each slice by hand
You may grow into microservices A single deployable is the goal
You need MongoDB, MySQL, PostgreSQL or Oracle SQL Server is fine

Moving from ABP is a port, not an upgrade: each ABP concept maps to something smaller and explicit in AppointMe.

ABP AppointMe Notes
IMultiTenant with a nullable TenantId A required CompanyId and a named EF filter No host side: platform-wide data has no CompanyId. See Multi-tenancy.
ICurrentTenant.Change(id) ICurrentCompany.Change(companyId) Both return a disposable scope.
Tenant resolvers (__tenant header, …) ICompanyDetection strategies. HeaderCompanyDetection ships. The header is X-Company-Id.
PermissionDefinitionProvider A static *Permissions class, registered with AddPermissions(assembly) See below.
[Authorize("…")], IAuthorizationService principal.Require(...) in the handler See Permissions.
IPermissionManager.SetForRoleAsync Default grants (IDefaultGrantPolicy) and per-company role overrides There are no per-user grants.
ApplicationService, CrudAppService One vertical slice per use case: command, handler and IEndpoint See Vertical slices.
IRepository<T> and unit of work The module’s DbContext in the handler. Wolverine wraps handlers in a transaction. Reads go through Dapper.
Local and distributed event buses Domain events on AggregateRoot, handled by Wolverine on durable queues See Domain events & messaging.
AbpModule and [DependsOn] An Add<Module>Module() extension and a .Contracts project See Add a module.
OpenIddict auth server and Account module Keycloak or Entra External ID Users move to the identity provider.
Features and editions Nothing equivalent You’d build it.

An ABP permission group becomes a static class with Permission fields. Assembly scanning finds it, so there’s no provider to register:

src/CRM/AppointMe.Crm/Customers/CustomerPermissions.csView source ↗
public static class CustomerPermissions
{
private const string Customers = "customers";
public static readonly Permission View = new(Customers, "view");
public static readonly Permission Create = new(Customers, "create");
public static readonly Permission Update = new(Customers, "update");
public static readonly Permission Delete = new(Customers, "delete");
public static readonly Permission ViewStatistics = new($"{Customers}.statistics", "view");
}

Every ABP fact on this page comes from abp.io and the ABP repository, accessed Nov 2026.

Source Used for
github.com/abpframework/abp LGPL-3.0 license, stars, contributors, releases (10.7.1, 11.0.0-rc.1)
Free vs Pro licenses Which templates, modules, UI and Account features are PRO
abp.io/pricing and abp.io/faq License tiers, perpetual licenses, seats, Pro module source access
Multi-tenancy Database models, resolvers, ICurrentTenant, Tenant Management vs SaaS
Authorization Permission definitions, grants, host and tenant sides
Distributed event bus Providers, outbox and inbox
React UI React stack and templates
Aspire integration Aspire in the microservice template, Business license requirement
Get started UI and database options, ABP Studio and CLI
Deployment Deployment guidance and quotes
Testing Template test projects and libraries
Modularity and Application services AbpModule, [DependsOn], ApplicationService
abp.io/demo Hosted demo and account requirement

AppointMe facts are from bravodev-hub/appointme at commit 2ccbe87.