Searchable Directory
Searchable Directory is a first-party, self-hosted widget for people, services, resources, locations, and other bounded collections of public cards. The published directory stays in DynoStatic; visitors do not send its contents or searches to a third-party directory or geocoding service.
Build a directory
Create Searchable Directory from the widget catalog. Each entry has a stable key and these operator-managed fields:
- name and summary;
- category and plain location text;
- an optional public image URL or Media library reference, with image alternative text;
- optional email, telephone, and website actions.
The visual editor supports up to 100 entries and submits one canonical JSON field, keeping rich cards below the max_input_vars limits common on shared PHP hosting. The collapsed advanced editor is also the no-JavaScript fallback. Entry keys remain stable when names change.
Websites accept only HTTPS or safe same-site relative destinations. Email and telephone actions are normalized to bounded canonical values. Public text is escaped, external website actions open with isolated relationship attributes, and invalid actions or images are omitted.
Larger directories and transfer
Use Directory import / export for 101–1,000 entries. The dedicated importer accepts CSV or DynoStatic Directory JSON uploads up to 3 MiB, with at most 1,000 entries, 50 distinct categories, and 2 MiB of canonical entry JSON. Summaries are limited to 500 characters. It stages and validates the complete file before making one revision-checked draft update; a malformed, oversized, stale, or conflicting upload changes nothing and never publishes automatically.
CSV supports these case-insensitive headings after spaces and punctuation are converted to underscores:
key, name, summary, category, location, image_url, image_alt, email, phone, and url.
name is required. A missing key receives a deterministic row key. CSV cannot carry a Media library reference; use a public image URL or the DynoStatic JSON format. JSON uses this envelope:
{
"format": "dynostatic-directory",
"version": 1,
"entries": []
}
Unknown or duplicate fields, arbitrary nested data, unsafe controls, invalid URLs, more than 50 categories, and any exceeded row or byte bound are rejected. CSV exports quote formula-like spreadsheet cells defensively. DynoStatic JSON preserves canonical Media library references and is the lossless format for a later re-import.
Public search and pages
Initial widget HTML contains only the first selected page: 12, 24, 36, or 50 entries. Search, category selection, and page navigation request bounded JSON from the physical api/?action=widget-directory&widget=... route generated for the installation's real root or subfolder URL. The endpoint reuses the origin-authorized immutable publication, never a working draft or another website's data, and returns a private ETag for conditional requests.
Search is capped at 200 characters and matches the published name, summary, category, location, email, and telephone fields. Page size never exceeds 50. Version 1 may scan the bounded 1,000-entry snapshot in memory; it does not geocode locations, call a search provider, or serialize all entries into the browser DOM.
Accessibility and templates
Directory cards are a semantic list with ordinary links, labeled search/category controls, a live result count, explicit empty states, keyboard-operable pagination, visible focus, and 44-pixel contact targets. Every update restores focus to the initiating control. Cards and long public values remain contained at 390, 768, and desktop widths.
People Directory supplies a team/community starter. Resource Directory supplies a guides/services/places starter. Both create ordinary editable drafts and follow the same publication and transfer boundaries.