The Laravel feedback board you don’t have to build.
FeedbackOwl is a Laravel feedback package: your users post ideas, vote and comment, and your team plans on a roadmap and announces what shipped in a changelog. It runs behind your login, in your database. You keep building your product; we maintain the feedback board.
Feedback
Suggest an idea, vote for what matters to you, and follow what happens to it.
Dark mode
Most of my work happens late in the evening, and the bright white screen is hard on the eyes.
A dark theme that follows the system setting would be perfect.
- Status
- In Progress
- Board
- Feature Requests
- Tags
- Quick Win
- ETA
- November 2026
- Posted by
- Ben O. (you)
Installation
Two minutes, five lines. Once Polar has invited your GitHub account, add the private repository to your app; Composer asks once for a GitHub token to read it. Laravel finds the service provider by itself, the migrations come with the package, and with one product the admin list is all the configuration you need.
Signed-in users can post, vote and comment right away. Link the board from your navigation with route('feedbackowl.index').
Why a package, not a SaaS
Add FeedbackOwl to your own apps and your clients’ apps, and leave the feedback board to us. New features, fixes and support for new Laravel and PHP versions arrive with composer update.
It’s a self-hosted alternative to Canny and Featurebase: no monthly bill per product or seat, no second login for your users, no widget from another domain, and your data stays in your database.
What’s in the box
One board per product or tenant
Scopes keep the posts, votes and settings of each product, workspace or customer apart, taken from the URL or from your own code.
Your permissions
Three Laravel gates decide who can view, take part and manage. Keep the defaults or plug in your own rules.
A PHP API and events
Everything the pages do is one call away, like Feedback::post() or changeStatus(), and every action fires an event you can listen to.
Moderation for your team
Change status with a public note, set a planned date, approve new posts, pin, merge duplicates, and keep boards and tags for the team only.
Fits any Laravel stack
Plain Blade pages with no JavaScript framework and no build step, so they sit next to Livewire, Inertia or Filament. Every form works without JavaScript.
Settings without a deploy
Statuses, boards, tags, roadmaps and labels are managed on a settings page, so your team or your client can change them without you.
Automatic translation
With your own OpenAI or Anthropic key, posts and comments appear in the reader’s language, with the original one click away.
Spam protection
Rate limits and a honeypot on every form. Finished and closed posts stop taking votes.
Tested and bilingual
Every text in English and German. Tested with Pest and Larastan (level 8) on SQLite and MySQL.
Looks like part of your app
Show the board inside your own layout or as a page of its own. Light and dark mode follow the system. Colours, font and corner radius are CSS variables, and you can override any single view or switch off our styles and bring your own. Try a few:
Feedback
Suggest an idea, vote for what matters to you, and follow what happens to it.
- In ProgressFeature RequestsDark mode
Most of my work happens late in the evening, and the bright white screen is hard on the eyes. A dark theme that follows the system setting would be perfect.
- PlannedFeature RequestsSync with Google Calendar
Our deadlines live in Halfmoon, our meetings in Google Calendar. A two-way sync would save us from keeping both up to date.
Extend it in plain Laravel
Composer, Blade, Eloquent and gates you already know. Import feedback from another tool, create posts from your support inbox, or notify voters when a status changes.
use FeedbackOwl\Events\StatusChanged;
use FeedbackOwl\Facades\Feedback;
$post = Feedback::post($user, 'Dark mode', 'Please follow the system setting.');
Feedback::vote($post, $anotherUser);
Feedback::changeStatus($post, 'planned', note: 'Coming in March.', by: $admin);
// Every action fires an event: PostCreated, VoteChanged, StatusChanged …
Event::listen(StatusChanged::class, NotifyVoters::class);Scopes
A separate board per product, workspace or tenant, taken from the URL or from your own code.
// /aawp/feedback, /clickwhale/feedback
'scope' => [
'resolver' => RouteParameterScopeResolver::class,
'available' => [
'aawp' => 'AAWP',
'clickwhale' => 'ClickWhale',
],
],
'routes' => [
'prefix' => '{scope}',
],Permissions
Check view, participate and manage like any other gate, or swap in your own rules.
@can('feedbackowl.manage')
<a href="{{ route('feedbackowl.index') }}">Manage</a>
@endcan
Gate::authorize('feedbackowl.participate');