Six months live, and Google shows it for nothing else.
A one-page site has too few URLs. A single page application has too little HTML. The fix for one does nothing for the other.
Your browser runs your JavaScript. A crawler's first pass does not. Fetch the raw HTML and read what actually arrives.
Prerender the public routes, use real paths instead of hash routes, and make every link a real anchor.
Then it is not technical. Search engines rank documents, and one page is one document competing for roughly one intent.
Your brand, a local service, a narrow portfolio. Not forty service queries. Those need forty documents.
Prerender the pages that matter, or serve a subdirectory on your own domain so the new URLs inherit your authority.
The render test, the fixes in priority order, and a 30-minute audit for either setup.