phlak/directory-lister
PHLAK DirectoryLister is a lightweight, standalone PHP directory listing tool that turns folders into browsable indexes. It offers sorting, search, breadcrumbs, file icons, and customizable templates with no database required.
DIRECT_LINKS capability (stable, shareable URLs to specific directories) materially improves this use case: it turns a folder listing into something you can deep-link from release notes, onboarding docs, or a support macro — which is exactly the loop that makes a stopgap measurable.ZIP_DOWNLOADS=false / ZIP_COMPRESS=false being silently treated as enabled) matter here specifically: "download the whole folder" is the primary QA action, and it is now trustworthy in a way prior versions were not.Consider it when most of the following hold:
./.. paths; direct-linked content reachable via query-string from outside the linked path). Read that as a product statement, not just a patch note: HIDE_* flags and direct-link scoping are convenience and tidiness controls, not an authorization boundary. Anything whose confidentiality matters must be gated in front of the app.Look elsewhere when:
/docs folder — that is the profile of a maintained project, not an abandoned one. It is still one primary maintainer with no commercial support, so "who patches this if they step away" remains an unowned risk on your side, not theirs.Adoption stance: green-light as an internal/secondary surface with a named owner and a 90-day review; red-light as a component of the core product architecture. New and existing deployments should be on 5.8.0 or later — earlier versions carry known access-control bypasses — and any post-upgrade verification should explicitly re-check ZIP flags, VCS-file hiding, and direct-link scope, since 5.8.0 fixes cases where those settings were silently ignored rather than honored.
To executives (one paragraph): Directory Lister is a mature, MIT-licensed, 2,500+ star open-source tool that turns any web-accessible folder into a browsable, downloadable listing. It carries no license cost and no vendor contract, and it can be live behind our existing login in days rather than the one-to-two sprints a native equivalent would take. Its latest release is a good signal: it fixed two access-control bypasses promptly, fixed folder-ZIP downloads that could produce incomplete archives, added stable direct links to specific directories, and modernized its tooling — the profile of a maintained project. I am recommending it narrowly: as an internal and stopgap capability — engineering artifacts, QA and design review, published asset downloads, and shareable links into those folders — to validate demand and deflect low-value support requests before we commit roadmap capacity to a first-party file-sharing feature. It is deliberately not proposed for regulated data or as infrastructure inside the main product, because it is a standalone application rather than a Laravel library and lacks the per-user permissions and audit trail we would need there; the recent security fixes reinforce that its "hidden" and "direct link" settings are organizational niceties, not access control. The ask is small: a container on 5.8.0, a proxy rule with authentication in front, and a 90-day checkpoint with a documented kill criterion.
To engineering (short): It is a standalone PHP app, not a Composer package — no service provider, no Laravel bindings, no shared session. Plan to run it as a sidecar in its own container behind the reverse proxy, with auth terminated at the edge, read-only mounts to the directories it serves, and no write path. Keep it out of the monorepo and out of the deploy graph for the core app; treat upstream as read-only and resist forking until we have evidence we need customization. Pin 5.8.0 minimum: it fixes hidden-file/directory checks being bypassed with non-canonical ./.. paths, and direct-linked content being reachable via query-string from outside the direct-linked path — do not run older tags anywhere, including internal-only hosts. While upgrading, re-verify configuration semantics rather than copying old .env files: ZIP_DOWNLOADS=false and ZIP_COMPRESS=false were previously interpreted as enabled, and HIDE_VCS_FILES was ignored due to a variable typo, so existing installs may have been running with settings that never took effect. Do not rely on HIDE_* flags or direct-link scoping as a security boundary. Watch the maintenance signal (single maintainer, zero dependents) and keep a version pin with an SBOM entry so we can patch deliberately on security releases.
To the team (framing): This is a probe, not a platform. We are buying information cheaply — whether people use a folder browser and shareable folder links, and what they ask for next — and we will retire it the moment a first-party feature, or a compliance requirement, makes it the wrong tool. Treat "hidden" as tidy, not as protected.
How can I help you explore Laravel packages today?