Skip to content

Licensing

AppJars can be used without a license in free mode. Free mode is intended for evaluation, development, and small-scale deployments. In free mode, certain AppJars enforce limits on the number of records or daily operations that can be performed.

A full license removes all free-mode restrictions. AppJars licenses are:

  • Perpetual with one year of updates — a license does not expire. It covers the AppJar version for which it was issued and all versions released within the first year after purchase. The last version released within that year continues to work indefinitely; a new license is required only if you choose to upgrade to a version released after the coverage period.
  • Unlimited users — there are no per-seat or per-user restrictions. The same license covers any number of users accessing the application.
  • Unlimited environments — the same license file is valid across all environments of the licensed application (development, testing, staging, production) without any additional configuration or separate license files.
  • Per application — a license is tied to a specific application and a specific AppJar. If you integrate multiple AppJars into the same application, each AppJar requires its own license file.

Licenses are issued by Flowing Code. To purchase a license, browse the AppJars catalog. For questions or custom arrangements, contact us. Full terms are available in the Software License Agreement.

Installing a License

Once you receive a license file, place it in the license directory on every server where the application runs. The license directory is resolved in this order:

  1. The path specified in the environment variable APPJARS_LICENSE_FOLDER
  2. The path specified in the Java system property com.appjars.license.folder
  3. The default directory ~/.appjars in the home directory of the user running the application

The application reads all license files from the resolved directory at startup. No configuration beyond placing the file is required. A restart is necessary after adding or replacing a license file; the license is not re-read at runtime.

The file name and extension do not matter. The application reads every file in the directory and ignores any that are not valid license files. If multiple AppJars are in use, place each AppJar's license file in the same directory. A single directory can hold license files for any number of AppJars.

Hosting Several Applications on One Server

Each license is issued for a specific application. When a single server runs only one application, no additional configuration is required: the application matches its own license automatically.

When more than one application runs on the same server and reads licenses from the same directory, set the Java system property appjars.applicationName on each application to the name its license was issued for:

-Dappjars.applicationName="My Application"

This tells each application which license in the shared directory belongs to it. If the property is omitted in this scenario, an application may match a license issued for a different application and fall back to free mode. Outside of this multi-application case, appjars.applicationName is not needed and can be left unset.

Verifying a License is Active

License validation is performed offline. Licenses are cryptographically signed and validated locally at startup; no external service is contacted and no network access is required.

Each AppJar validates its license once when the application starts and keeps the result for the lifetime of the run. At startup, every AppJar logs a single line indicating whether it is running with a full license or in free mode. Reviewing the application log on startup is the way to confirm a license has been recognised.

Free Mode Limits

The table below lists the restrictions applied to each AppJar when running without a license.

AppJar Free Mode Limit
Activity Log 100 log records saved per day. When the daily limit is reached, new log events are discarded, the management views become read-only, and inspecting an entry is disabled until the counter resets. Live mode is a licensed feature and is unavailable in free mode regardless of the daily count.
AI Support 50 messages exchanged per day (manual requests and automatic responses combined). Once reached, new messages are blocked and an alert is shown in the chat view.
Configuration Manager 5 configurations total (system and user configurations combined). Configurations whose name begins with com.appjars. are read by the AppJars themselves and do not count towards the allowance. Once 5 exist, the button that creates a configuration is disabled and attempting to create another raises an error. If more than 5 exist, editing is blocked as well: the Edit value, Show history, Restore configuration and Edit configuration actions are disabled until enough entries are deleted. Deleting is never restricted.
Data Query 5 queries that a user can open, and 1 dashboard. Queries that only store their results in a temporary table are intermediate steps of a chain rather than something a user opens, so they are unlimited and do not count towards the five. There are no limits on parameters or result columns. Attempting to exceed either limit raises an error.
Dynamic Menu 5 menu items total. Attempting to create additional items raises an error.
Email Manager 5 emails sent per day. Emails that exceed the limit are queued (SEND_PENDING) rather than rejected, and will be sent once the daily counter resets.
I18N Manager 2 languages and 100 translation items total. Attempting to exceed either limit raises an error.
Issue Tracker (No free-mode restrictions currently implemented)
Process Manager 2 processes total. Once 2 processes exist, the New Process button is disabled and attempting to create another raises an error. Both processes remain fully operable: they can be scheduled, paused, resumed, executed on demand and deleted.
User Manager 5 users maximum. Once 5 users exist, all management views (users, groups, roles, access rules) are locked and a progress bar shows the remaining capacity. Existing users can still be deleted to free up slots.
User Profile 5 profiles maximum. A restrictions bar sits above the profile views for the whole free-mode run. Once 5 profiles exist, creating a new profile is blocked and the post-login redirect to profile creation is suppressed; existing profiles remain editable, and deleting one frees a slot. If more than 5 exist, editing is blocked as well: the Edit row action and the Save button of an existing profile are disabled until enough profiles are deleted.

Note

Daily limits (Activity Log, AI Support, Email Manager) reset at midnight in the server's configured timezone. Record limits (Configuration Manager, Data Query, Dynamic Menu, I18N Manager, Process Manager) are cumulative and do not reset.

How Limits Are Enforced

Free-mode limits are enforced within the AppJar. When a limit is reached, the operation is blocked and a warning notification is shown to the user. Email Manager is an exception: rather than blocking the send operation outright, emails that exceed the daily limit are queued and delivered once the limit resets at midnight.

Where an AppJar shows a restrictions bar, it appears for the whole of a free-mode run, not only once the limit is reached, so the remaining capacity is visible before anything is blocked.

Features That Require a License

A few capabilities are gated on the license itself rather than on a counter. They are unavailable for the entire duration of a free-mode run, however far below its limit the AppJar is:

AppJar Licensed feature
Activity Log Live mode. The Live toggle is not displayed in the Activity Log view or in any saved log view, and the underlying event subscription is refused. Capture, querying, and filtering are unaffected.

Troubleshooting

If an AppJar runs in free mode when a full license is expected, the startup log identifies the cause. The most common cases are:

Startup message Cause Resolution
The AppJar reports it is running in free mode and no license was found No license file is present in the resolved directory Confirm the license file is in the license directory and that APPJARS_LICENSE_FOLDER (or com.appjars.license.folder) points to it.
A license was found "but for a different application" The license was issued for another application name On servers hosting several applications, set appjars.applicationName to the name the license was issued for. See Hosting Several Applications on One Server.
A license "does not cover this version" (it expired or the trial ended) The AppJar version in use was released after the license coverage period Upgrade the license, or use a version released within the coverage period. See the coverage terms above.

A restart is required after adding, replacing, or correcting a license file, because licenses are read only at startup.