Case study
DemoLaw firm company profile + CMS
A company profile for a fictional law firm, with an admin panel so the content can be updated without touching any code.
- Role
- Planning, development, testing, and deployment
- Demo name
- Kantor Hukum Nalar Saksama
- Stack
- Laravel 13
- Filament 5
- Livewire 4
- Blade
- Tailwind CSS 4
- SQLite
- PHP 8.3
- Caddy
- Source code
- View on GitHub: Law firm company profile + CMS (opens another site)tenmaryut/company-profile-hukum
The business in this demo is fictional. The data in it is not real.


The problem
A small law firm needs a website that feels trustworthy and informative, yet its content changes often: practice areas, lawyer profiles, articles, and FAQs. If every change has to go through a developer, the site goes stale quickly.
There are ethical limits too: lawyers may not over-promote their services, for example by claiming to be "the best" or promising case outcomes. The consultation form also collects personal data from prospective clients, which must be protected.
The solution
The company profile is built with Laravel 13 and a Filament admin panel. Site managers can edit practice areas, team members, illustrated articles, FAQs, and page copy, and read consultation requests from a single dashboard.
The copy is informative without overstated claims, including six original legal articles whose references were checked against official sources. The consultation form comes with a privacy notice, spam protection, and automatic deletion after 7 days, following the principles of Indonesia’s Personal Data Protection Law (Law No. 27 of 2022).
Key features
- Home, firm profile, practice areas, team, FAQ, and contact pages with a static illustrated map
- Six legal articles with categories, search, a table of contents, and footnotes, including pieces on Indonesia’s new Criminal Code and Criminal Procedure Code
- Consultation form with a honeypot, a time trap, rate limiting, and privacy consent
- Filament admin panel for practice areas, team, illustrated articles, FAQs, page copy, and consultation requests
- Demo account shown on the admin login page, with data reset automatically every night
- SEO: meta tags, Open Graph, sitemap, LegalService, Article, and FAQPage structured data, and custom error pages
- Calm CSS animations without JavaScript: a staged hero with an ink line, cards that appear on scroll, page transitions, smoothly opening FAQs, and a reading progress bar
Animation clip
Technical challenges
Personal data that does not pile up
Consultation requests are deleted automatically after 7 days by a scheduled task that runs every hour. Admin notifications contain no personal data, and the demo account can only see sample data and submissions from its own browser.
A strict CSP without breaking the admin panel
Public pages ship no JavaScript (the mobile menu and FAQ use the details element) and self-hosted fonts, so they can run under a strict Content Security Policy. The Filament panel, which needs inline scripts, gets its own policy.
A public demo that recovers safely
All demo data is reset every midnight with a systemd timer. The reset command validates all content first, so it fails safely if anything is broken, and the real admin account is stored separately.
A locked-down server
Laravel runs in its own PHP-FPM pool as www-data with open_basedir, its socket is reachable only by Caddy, and the .env file and database folder have strict permissions.
Test results
Lighthouse (mobile)
Home page
Measured page: /
Article: key changes in the new Criminal Code
Measured page: /artikel/kuhp-nasional-pokok-perubahan
Measured on October 3, 2026 with Lighthouse 13.5.0 in mobile mode, directly against the live site. Scores can vary slightly between runs.
Automated tests
- Laravel tests: public pages, form validation and storage, admin access, demo reset, domain readiness PHPUnit59
- End-to-end tests: form submission, demo admin login, responsive layout, and animations (including reduced motion) Playwright13
72 tests in total, all passing according to the project’s test report from October 3, 2026.