Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel App Settings Laravel Package

qcod/laravel-app-settings

Add a settings manager with UI to your Laravel app. Settings are stored in the database and cached for zero-query performance, with configurable inputs, sections, and styling (Bootstrap 4 by default). Includes a facade for easy access.

View on GitHub
Deep Wiki
Context7

Product Decisions This Supports

  • Build vs. buy for the "admin settings" capability. Every B2B-ish app eventually needs a runtime-editable settings surface (app name, sender identity, branding assets, maintenance copy, toggles). The default answer is a custom CRUD screen: migrations, form validation, cache invalidation, file-upload replacement, controller, views, and an authorization story — realistically 1–2 sprints of a full-stack engineer plus ongoing maintenance. This package collapses that to a Composer install, one published config file, one migration, and a handful of config arrays. That is the core PM decision it informs: do we spend roadmap capacity on undifferentiated admin plumbing, or on product?
  • Feature scoping — ship "configurable" instead of "hardcoded." White-labeling, per-tenant branding, from_email/from_name identity, date-format preferences, upload-a-logo, and simple on/off toggles are all declaratively defined as sections → inputs with per-field rules, value defaults, hints, and data_type casts. This lets you answer "can we make X configurable?" with "yes, one config entry" rather than "that's a ticket."
  • Deferring a proper admin panel. If the roadmap already includes Filament/Nova/Backpack, this is a stopgap that buys you a settings page before the admin framework lands — and it doesn't block migration, since the underlying storage is just a cached key-value table.
  • GTM / sales-enablement features. Per-tenant or per-user settings via setting_group (a closure like 'user_'.auth()->id(), or runtime setStorageGroup()) unlock white-label demos and enterprise "your logo, your sender address" conversations without a bespoke build per prospect.
  • Operational autonomy as a product outcome. Non-engineers (support, ops, marketing) can change maintenance notices, sender names, and copy through a UI instead of filing tickets. That's a support-cost reduction and a release-cadence win, not just a code shortcut.
  • Deciding whether settings changes need a deploy. Config-driven inputs mean the schema of settings still ships with code, but the values don't. That's the right trade for values that change weekly (copy, branding) and the wrong one for values that must be tuned hourly.
  • Scope guardrail for feature flags. Because boolean inputs and grouped settings make it tempting, this explicitly informs a no decision: it is a settings store, not a flag system. No targeting, no gradual rollout, no audit log, no evaluation SDK. If experimentation is on the roadmap, budget separately.
  • Data-ownership decision. Adopting this moves configuration out of code and into the database. That's a real architectural commitment with downstream consequences (see the engineering note below), and the PM should own it consciously rather than let it slip in as an implementation detail.

When to Consider This Package

Adopt when most of these are true:

  • The app is Laravel 5.5+ (auto-discovery; 5.4 and below needs manual provider/facade registration) and the settings surface is an internal, authenticated admin page.
  • The setting count is modest — roughly under ~50 fields, organized into a few sections. Reads are frequent and writes are rare, so the package's "cache settings, zero SQL on read" design is a genuine win rather than a footnote.
  • The team is comfortable with PHP-array-as-schema. Defining inputs in config/app_settings.php is fast and diffable, but you get no typed DTOs, no IDE autocompletion, and no compile-time safety.
  • You want file/image uploads handled for you — automatic replacement of old files, configurable disk and path, plus a mutator escape hatch for resizing or custom storage (e.g. Intervention Image). Writing this by hand is the single most tedious part of a custom build.
  • Your CSS is Bootstrap 4, or you're willing to override the class strings (section_class, input_class, submit_btn_text, etc.) or supply your own Blade view via setting_page_view and @include('app_settings::_settings'). The default styling is opinionated; plan for an hour of theming, not zero.
  • You want optional flexibility to use it without the UI — the same facade and setting() helper work as a plain key-value store for API-only contexts, provided you set 'remove_abandoned_settings' => false so undefined fields aren't purged on save.

Look elsewhere when any of these are true:

  • You need typed, castable, encrypted, or model-scoped settings. spatie/laravel-settings is the stronger choice for code-first, strongly typed settings classes with migrations and encryption. This package's data_type casts (int, bool, array, string) and accessor/mutator hooks cover simple cases, not a typed settings domain.
  • You already run an admin framework. Filament, Nova, or Backpack ship form builders; a settings page there keeps auth, layout, and UX consistent and avoids a second styling system.
  • You need feature flags, experimentation, or per-request targeting. Use a dedicated flag service. Do not stretch boolean inputs into a flag system.
  • You need an audit trail of who changed what and when. Settings-as-data with no change log is a compliance gap in regulated contexts.
  • Multi-tenancy is heavy or high-churn. The setting_group closure approach is elegant for light per-user grouping, but it's fragile in queued jobs and CLI/Artisan contexts where auth()->id() doesn't exist, and per-tenant cache invalidation gets complicated at scale.
  • Deploy-time configuration is sufficient. If env vars and config/ files already cover it, take the zero-dependency path. Adopt this only when humans must change values without a release.
  • Vendor-risk tolerance is low. Signals here are mixed: MIT license, changelog and releases published, a clear README — but 339 stars, 0 dependents, a single-maintainer profile, and a low opportunity score (19.09) all point to a small, crowded niche rather than a de facto standard. Mitigant: the surface area is tiny and the license permissive, so a fork is a day of work, not a quarter. That asymmetry is what makes adoption defensible.

Two things I'd verify in a two-day spike before committing: (1) whether the package's settings route ships behind any middleware — assume you must attach your own auth/can: gate, since an unauthenticated settings page is a privilege-escalation bug, not a styling issue; and (2) the remove_abandoned_settings default and how it interacts with any non-UI setting()->set() calls you make from code, because a UI save can silently delete data you wrote programmatically.

How to Pitch It (Stakeholders)

For executives — the one-paragraph version. We have a recurring, low-differentiation need: letting non-engineers change things like the app name, the sender address on transactional email, logo and branding assets, and maintenance messaging, without a deploy. Building that ourselves is one to two sprints of engineering plus permanent upkeep. qcod/laravel-app-settings gives us that surface — database-backed settings with caching, per-field validation, file uploads, and an optional UI — for the cost of a Composer dependency, one migration, and a config file. It's MIT-licensed, so there's no procurement, no seat cost, and no lock-in. The tradeoff is community size: it's a small, single-maintainer project, but it's also small enough that if it were ever abandoned we could fork it in a day. Recommendation: approve a short timeboxed spike to put it behind our auth gate and use it for branding and email-identity settings, capped at a modest field count. Explicitly out of scope: feature flags, secrets, and anything requiring an audit trail.

For engineering — what we're actually signing up for. It's a thin UI layer over qcod/laravel-settings: a settings table, a cached key-value store, and a Blade-rendered form generated from config/app_settings.php. We get a setting() helper and an AppSettings facade, closures for dynamic select options (App\City::pluck(...)) and for most field values, accessor/mutator hooks for custom transforms, and grouped storage for per-user or per-tenant scoping. It ships Bootstrap 4 markup, overridable via class config or a full view swap. Four things we own, not the package: (1) Authorization — we must gate the settings route behind our own middleware; do not assume it's protected. (2) Secrets policy — settings are stored in plaintext in the DB and the documented pattern serializes all settings into a Blade template as window.App = {!! json_encode(...) !!} for JS access. Never put API keys or credentials in here; write that rule down. (3) Environment promotion — configuration stops being code. Staging and production settings will drift, settings must be added to backup/restore and DR runbooks, and "it works in staging" no longer implies the same config values. (4) Cache semantics — reads are cached, so any write that bypasses the package (raw SQL, seeders, direct DB edits) won't be reflected until the cache clears. Also set remove_abandoned_settings => false if we mix UI-defined fields with programmatic setting()->set() calls, or a UI save will delete the latter.

The ask: a two-day spike — install, gate the route, define five real settings (logo upload, app name, from_email, from_name, one maintenance boolean), theme it to our CSS, and confirm the cache and cleanup behavior. Ship if it clears; revisit if typed settings, per-tenant scale, or audit requirements arrive on the roadmap.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
takashato/laravel-vietqr
aitor24/laralang
kraenzle-ritter/entity-relations
dindigital/din-image
pomirleanu/image-colors
sawmainek/laravel-api-generator
delatbabel/jsonresponses
mouhamedfd/permissions-generator
eduplus/qr
laravel2580/idehelpers
delatbabel/viewpages
anavel/gettext
muhamadrezaar/highcharts
delatbabel/keylists
frankkessler/salesforce-laravel-oauth2-rest
anavel/foundation
wdmtech/enviricons
eii/laravel-captcha
muka/shape-reader
tdt/json