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
At a glance
Section titled “At a glance”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).
Where AppointMe is stronger
Section titled “Where AppointMe is stronger”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
AbpModuleorApplicationServicebase 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.
Where ABP is stronger
Section titled “Where ABP is stronger”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.
Choose ABP if… / choose AppointMe if…
Section titled “Choose ABP if… / choose AppointMe if…”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 |
Migrating from ABP
Section titled “Migrating from ABP”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:
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");}Sources
Section titled “Sources”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.