|
2 | 2 |
|
3 | 3 | [](https://github.com/JamieP-205/local-web-fix/actions/workflows/ci.yml) |
4 | 4 |
|
5 | | -## Live site |
| 5 | +Live at [localwebfix.co.uk](https://localwebfix.co.uk/). |
6 | 6 |
|
7 | | -The service is live at [localwebfix.co.uk](https://localwebfix.co.uk/). Enquiries are delivered via Netlify Forms and followed up manually. |
| 7 | +A small service site. Local businesses send me a link to their website, Google listing or Facebook page, and I check whether a customer can actually find the basics: opening hours, the menu, a phone number that works on a phone, a booking link that is not dead. |
8 | 8 |
|
9 | | -## Status |
10 | | - |
11 | | -**Live service website** - this project is in production and used to accept enquiries from real clients. |
12 | | - |
13 | | -## Summary |
14 | | - |
15 | | -Local Web Fix is a focused service website offering practical website and online-information improvements for UK local businesses. Many small businesses already have a site, Google profile, menu, booking link or social page but customers still struggle to find basic information. This site positions my service around those specific problems: opening hours, contact routes, mobile clarity, menus, prices, services and inconsistent public details. It avoids fake testimonials, ranking promises or agency-style marketing and instead explains my scope and process clearly. |
16 | | - |
17 | | -## Preview |
18 | | - |
19 | | - |
| 9 | + |
20 | 10 |
|
21 | 11 | ## Why I built it |
22 | 12 |
|
23 | | -I wanted to help local businesses fix the most important issues on their existing web presence without selling a full redesign they may not need. By offering targeted audits, clear handover templates and honest pricing, I can practise both technical and communication skills while studying. |
24 | | - |
25 | | -## What I built |
26 | | - |
27 | | -- A mobile-first service website with light and dark themes and a persistent theme preference |
28 | | -- A Netlify Forms enquiry flow with required-field validation and a honeypot field to deter bots |
29 | | -- Clear pricing, scope, access-safety and privacy information on dedicated pages |
30 | | -- An unlisted payment page used only after a job scope is agreed |
31 | | -- A fictional example audit that is clearly labelled as an example |
32 | | -- Operating templates for audits, proposals, handovers and releases in `docs/` |
33 | | -- A custom 404 page, sitemap, robots file, web manifest and social preview image |
| 13 | +Most small businesses do not need a rebuild. They need the details customers rely on to be correct and easy to find. This is my attempt to offer that smaller practical service while I build experience alongside university. |
34 | 14 |
|
35 | | -## Business thinking |
| 15 | +## The code is deliberately simple |
36 | 16 |
|
37 | | -This project forced me to think beyond code. I wrote copy that sets client expectations, created a pricing model that reflects the value of small fixes, established a safe process for accessing client sites without requesting passwords and built templates for audits and proposals. I also learned to keep the service honest: by making it clear I am a student and that I do not guarantee search-engine rankings or oversell my capacity, I build trust instead of hype. |
| 17 | +It is HTML, CSS and a theme toggle. The work went into the wording: |
38 | 18 |
|
39 | | -## Key files |
| 19 | +- **Pricing is on the page.** Free check, then £50, £100 or £150 with what each includes. No "contact us for a quote". |
| 20 | +- **The scope page says what I will not do.** No SEO campaigns, no payment systems, no plugin surgery. If another provider manages the site, I hand over notes rather than trying to take over. |
| 21 | +- **No passwords, ever.** The first check uses public links only. If a fix needs access later, it goes through proper collaborator or manager permissions. I am a student, and I should not be holding the logins to somebody's livelihood. |
| 22 | +- **The example check is labelled fictional**, because it is. It stays that way until a real business is happy for me to publish theirs. |
40 | 23 |
|
41 | | -- `index.html` - homepage and enquiry form |
42 | | -- `privacy.html` - privacy information |
43 | | -- `scope.html` - service boundaries and terms |
44 | | -- `pay.html` - unlisted scope-confirmed payment links |
45 | | -- `theme.js` - persisted light/dark theme preference |
46 | | -- `docs/` - reusable operating templates and release notes |
47 | | -- `tools/check-site.js` - site and link validation script used in CI |
| 24 | +## Files |
48 | 25 |
|
49 | | -## Technical approach |
| 26 | +- `index.html` the whole pitch, and the enquiry form |
| 27 | +- `scope.html` what is and is not included |
| 28 | +- `privacy.html` what happens to what people send me |
| 29 | +- `pay.html` payment links, unlisted and `noindex`, only sent once a scope is agreed |
| 30 | +- `theme.js` light/dark toggle, saved in localStorage |
| 31 | +- `docs/` templates I use for the actual work: audits, proposals, handovers |
| 32 | +- `tools/check-site.js` the checks CI runs |
50 | 33 |
|
51 | | -The project uses semantic HTML, CSS and a small vanilla JavaScript theme controller. There is no client-side framework because the site does not need one. The enquiry form is handled by Netlify Forms, which stores submissions and sends email notifications. The form never asks for passwords or account credentials. If later work needs access, the process uses limited collaborator or manager permissions where the platform supports them. |
52 | | - |
53 | | -## Local development |
| 34 | +## Running it |
54 | 35 |
|
55 | 36 | ```bash |
56 | 37 | npm install |
57 | 38 | npm test |
58 | 39 | npx serve . |
59 | 40 | ``` |
60 | 41 |
|
61 | | -No build step is required. `npm test` checks JavaScript syntax, required files, metadata, local links and the Netlify form configuration. |
62 | | - |
63 | | -## Deployment checks |
64 | | - |
65 | | -After a Netlify deployment I: |
66 | | - |
67 | | -1. Submit a test enquiry |
68 | | -2. Confirm it appears in Netlify Forms |
69 | | -3. Verify the email notification |
70 | | -4. Check the main information pages and a missing URL |
71 | | -5. Confirm the payment page remains outside public navigation |
72 | | - |
73 | | -## Privacy & safety notes |
74 | | - |
75 | | -The service never stores or asks for passwords. All `.env` files and secrets are excluded from the repository. See [SECURITY.md](SECURITY.md) for vulnerability reporting and [CONTRIBUTING.md](CONTRIBUTING.md) for project rules. |
76 | | - |
77 | | -## What I learned |
| 42 | +No build step. `npm test` parses the JavaScript, checks that required pages exist, verifies local links with exact filename casing and validates the full Netlify form setup. The form is the main conversion point, and a missing attribute can stop submissions without breaking the rest of the page. |
78 | 43 |
|
79 | | -By building Local Web Fix I learned how to scope and price a service, communicate limitations transparently, and design a simple website that gets clients to the enquiry stage without friction. I also gained practice in writing privacy policies, managing Netlify Forms, and thinking through client handover and access safety. |
| 44 | +## Gotchas |
80 | 45 |
|
81 | | -## Future improvements |
| 46 | +- The form is Netlify Forms, so it only works on a Netlify deploy. It does nothing on `npx serve`. |
| 47 | +- Reaching the thanks page does not prove an email went out. Netlify stores the submission either way, while email notifications are configured separately in the Netlify dashboard. |
| 48 | +- `pay.html` is deliberately not in the navigation or the sitemap. Do not link it. |
82 | 49 |
|
83 | | -- Collect anonymous feedback after each completed job to improve the service |
84 | | -- Automate audit generation based on a checklist of common issues |
85 | | -- Explore offering monthly monitoring as an optional add-on |
| 50 | +## Next |
86 | 51 |
|
| 52 | +- A real example report, once a client is happy for me to publish one |
| 53 | +- Feedback after a finished job, so I have something better than my own opinion of how it went |
0 commit comments