Buskers
I took over a dance school's 2018 website, kept it live until sign off, and broke none of its old page addresses.
Live since 2 Oct 2026
36 of 36 old page addresses land on the matching section of the new page, by permanent redirect.
Measured, source 3Checked on 25 Oct 2026, each address with the trailing slash WordPress used.
0 to 6 security headers on the home page: none on the old WordPress server, six on buskers.in.
Measured, source 2The old count is from my audit notes at the takeover. The new one was read from the live site on 25 Oct 2026.
0 to 3 ways to start a WhatsApp enquiry: none on the 37 old pages I crawled, three on the new page.
Measured, source 44.04 MB to 0.44 MB downloaded by the home page before any scrolling, desktop, lab median of 3 cold loads. The old side is the old site's static copy, which loads every image at once.
Measured, source 1The original loaded its images and map embed later, as they came into view. The stage shows the scrolled totals too.
Old stage, new stage
Drag the handle across the home page, or switch to the phone screen. On the left, the old site before any tap or mouse move. On the right, buskers.in on 25 Oct 2026. Same screen, same scroll position.




What to look for
- Headline Old: the scripts that built the hero waited for the first mouse move, so YOUR WAY sat on top of the menu. New: the headline is plain HTML, readable before any script runs.
- Calling Old: no call or WhatsApp button on the first phone screen. New: Call now and WhatsApp stay on every phone screen. Switch to the phone screen to see it. Measured, source 6
- Weight Old copy: 4.04 MB before any scrolling. New: 0.44 MB. Counted in blocks below. Measured, source 1
Counted in blocks of 100 KB
Desktop, a cold load before any scrolling, median of 3 lab runs. One block is 100 KB. One dot is one request. Measured, source 1
The static copy of the old home page downloaded 4,036,739 bytes in 60 requests, 40.4 blocks. The new home page downloads 444,297 bytes in 18 requests, 4.4 blocks: 89 percent fewer bytes and 70 percent fewer requests. Measured, source 1
The new figure is the whole site, gallery photos and map included. The old one is the static copy's home page alone.
The old side is the static copy of the old site. It loads every image and the map embed at once, where the original loaded them later, and it skips the scripts the original held until the first tap or mouse move. The original server was never timed, so this page compares bytes and requests, not load times.
Everything saved first
Before I changed a line, I saved the old site through its own public WordPress API and a headless browser.
That gave me 37 pages, 123 media library files and 74 desktop and phone screenshots. 121 of those 123 files were uploaded in 2018, and the newest page edit dated from 8 Apr 2023. Measured, source 8
The screenshots showed what a visitor saw before any input. On desktop, the headline sat on top of the menu until the first mouse move. On a phone, 7 of the 37 pages captured as exactly one screen tall, and on the two I opened, the text started behind the header in small grey type. Measured, source 9
Some things were missing from the export. The founders' photos lived in the theme folder, so they came back from the Wayback Machine. Gallery post names did not match their photos, so I rebuilt the albums from the old category pages: 218 photos in 5 albums. Measured, source 10

The old site stayed on stage
The obvious way
The old site had to stay live until the new one was signed off. The plain way to do that is to keep the old WordPress server answering until launch day.
What it would cost
Pointing the domain back would have kept every visitor on the old WordPress server, which sent no security headers, until launch.
The old pages had to stay on screen, not the old server behind them.
What I built
A static copy. A GitHub runner pointed the domain at the old server's address on its own machine, copied the site with wget, and fetched every address in its four sitemaps, because some pages were linked only by short links. 215 pages, gallery posts included, and 71 MB of plain files went back on buskers.in the same day, with four security headers the old server never sent. Measured, source 12
An outside check from 40 test locations loaded the copy from 39, India included. The trade: a static copy cannot run the old enquiry forms. It held the domain until launch on 2 Oct 2026, and it is still kept for a rollback. Reported, source 13
Every old page address still lands
Search results and saved links pointed at the old WordPress page addresses. I sent each one to the matching section of the new page, so none of them breaks.
My first redirects returned 404 for addresses ending in a slash, which is how WordPress writes them. Turning trailing slashes off fixed it, and the checks now always include the slash. On 25 Oct 2026, 36 of 36 old page addresses landed on their section by permanent redirect, and the old admin addresses led to the home page. Measured, source 3
Company email ran on Google Workspace on the same domain. Its two mail records and a corrected SPF record went into Cloudflare before the name servers moved; the old SPF record had not included Google's servers. All of them were still in place on 25 Oct 2026. Measured, source 14
Security headers went from none to six, among them a content security policy and HSTS with preload. With no CMS, plugin or admin login left, there is nothing on the server side to patch. Measured, source 2
One bug only showed up behind some office networks: the site would not load there while every outside check passed. The cause was Encrypted Client Hello, which some network middleboxes drop, and switching it off for the domain fixed it.
36 of 36 old page addresses land on the matching section of the new page, by permanent redirect. Measured, source 3
Try an old address
Results from my check on 25 Oct 2026. Open an address to see it live.
Turn on JavaScript to pick an address. The full list is below.
All 36 old page addresses
| Old address | Lands on |
|---|---|
/home/about/ | About #about |
/dance-forms/ | Styles #styles |
/dance-forms/hip-hop/ | Styles #styles |
/dance-forms/contemporary/ | Styles #styles |
/dance-forms/jazz/ | Styles #styles |
/dance-forms/bollywood/ | Styles #styles |
/dance-forms/salsa/ | Styles #styles |
/our-courses/ | Courses #courses |
/our-courses/beginner-course/ | Courses #courses |
/our-courses/intermediate-course/ | Courses #courses |
/our-courses/badc-course/ | Courses #courses |
/our-courses/bdc-course/ | Courses #courses |
/events/ | Events #events |
/events/fusion/ | Events #events |
/events/d-fest/ | Events #events |
/events/badc-show/ | Events #events |
/wedding-choreography/ | Services #services |
/corparate-dance/ | Services #services |
/dance-workshops/ | Services #services |
/gallery/ | Gallery #gallery |
/gallery1/ | Gallery #gallery |
/gallery/all/ | Gallery #gallery |
/gallery/all/fusion-2018/ | Gallery #gallery |
/gallery/all/fusion-2017/ | Gallery #gallery |
/gallery/all/d-fest-2017/ | Gallery #gallery |
/gallery/all/badc-2018/ | Gallery #gallery |
/gallery/fusion/ | Gallery #gallery |
/gallery/fusion/fusion-2018/ | Gallery #gallery |
/gallery/fusion/d-fest-2018/ | Gallery #gallery |
/gallery/d-fest/ | Gallery #gallery |
/gallery/d-fest/d-fest-2017/ | Gallery #gallery |
/gallery/badc/ | Gallery #gallery |
/gallery/badc/badc-2018/ | Gallery #gallery |
/artists/ | Team #team |
/faq/ | FAQ #faq |
/contact/ | Enrol form #enroll |
Ways in the old site never had
The institute already runs on WhatsApp, so every enquiry form on the new page ends there, with the answers already typed.
The enrol form and the D'Fest registration build the message and open WhatsApp, so there is no form backend to host, secure or watch. On a phone, Call and WhatsApp stay pinned to the bottom of every screen; the old home page's first phone screen had neither. Measured, source 6
Studios used to be a list of names with one map at a time. Now a visitor types an area or shares their location, and the studios rank by distance with directions. The place search is boxed to Jaipur, because unbounded, a search for Vaishali found a town in Bihar.
| Way in | Old site | New site |
|---|---|---|
| Start a WhatsApp enquiry | None on the 37 pages I crawled | 3: the floating button, the enrol form and the D'Fest form Measured, source 4 |
| Call or WhatsApp from the first phone screen | Neither | Both, pinned to the bottom of every phone screen Measured, source 6 |
| Find the nearest studio | A list of names, one embedded map at a time, no search | Area search boxed to Jaipur or your location, nearest first, with directions |
| Read by search engines as | WebPage, WebSite, Organization and breadcrumbs, with one description shared by all 37 crawled pages | A DanceSchool, with its founding year and address Measured, source 17 |
| Preview when the link is shared | No share image on the home page | A 1200 by 630 share card Measured, source 17 |
Built to keep running
The new site is one static page: about 1,380 lines of its own code and four front end libraries, with no server code, no database and no admin login. Measured, source 15
I measured before optimising. The 3D stage was cheap, so it stayed. The gallery ring was not: it fetched 28 photos at startup, so now it loads only when the gallery is near. Measured, source 18
The libraries ship as separate cached files, so after a site edit a returning visitor fetches about 5.6 KB of JavaScript instead of 191 KB. Map tiles and place search come from OpenStreetMap, with no key to expire and no bill. Measured, source 18
The smoke test runs at desktop and phone screen sizes and with WebGL switched off. I wrote the call button checks before the buttons, so the run before them passed 9 of 12; after the buttons, 13 of 13, three runs in a row. Measured, source 19
The family edits copy in a Google Doc, as suggestions and comments, and nothing goes live without an explicit go ahead to deploy. Every image on the new page has alt text or is marked as decorative, where 10 of 51 on the old home page had no alt attribute. Each pitfall from the build is written down with its cause and fix. Measured, source 20
0.69 ms of a 16 ms frame for the 3D stage, so it stayed as it was. Measured, source 18
1,647 KB to 400 KB first load at phone screen size, once the gallery photos waited for the gallery. Measured, source 18
13 of 13 smoke checks passing on the live site at the 4 Oct 2026 deploy. Measured, source 19
The handover, in eight counts
Each count is one change, with the reason it came next.
8 counts, 26 Sep to 4 Oct 2026. Launch came 6 days after the first commit. Measured, source 21
- Save the old site: 37 pages, 123 media files, 74 screenshots Measured, source 8
So the old site's own content was the source of truth before anything changed.
- Build the first version on a preview address
So the school's site no longer depends on the developers who built the 2018 theme.
- Carry everything over: the studio map, all the original text, D'Fest, 218 photos in albums Measured, source 10
Keep what the old site had, and make the studios findable.
- Fix what the first look found
Expanded event cards clipped their titles, the scroll library swallowed the mouse wheel in dialogs, and the crawl had missed the founders' photos.
- Move DNS to Cloudflare, mail records first
Take DNS off the old host without breaking company email, then switch off Encrypted Client Hello for the connections some office networks dropped.
- Mirror the old site and put it back on the domain
The old site had to stay live until sign off.
- Launch on buskers.in after sign off
The share card and the family's Google Doc went in the same day, and the domain moved to the new site.
- Call and WhatsApp on every screen, a smoke test, an optimisation pass
Reaching the institute should take one tap from any screen. Then I measured what each part cost.
The way back: swap the domain back to the copy of the old site. It is the same four calls as the launch, in reverse, and the copy is still there. Measured, source 11
What I learned
Save first, change second: the crawl gave me the copy, the photo albums and the list of old addresses every redirect check runs against. Measure before you optimise: the 3D stage cost 0.69 ms of a 16 ms frame, while 28 gallery photos loading at startup were the real weight. And keep a way back: the old site is still one domain swap away. Measured, source 18
Get this for your business
- Who it is for
- Small institutes, studios and family businesses whose website was built, and is still run, by someone else, often on WordPress.
- What you get
- A takeover that keeps your current site live until you sign off. I save every page and photo first, move the domain and DNS without dropping your company mail records, and send every old page address to its new home. Then I build a static site with WhatsApp enquiries, a nearest branch finder and copy you edit in a Google Doc.
- What you need
- Access to your domain's registrar account, whoever runs your company email, one person who signs off copy, photos you have consent to publish, the WhatsApp number enquiries should reach, and hosting and analytics accounts in your business's name.
- Setup
- Buskers took 6 days from my first commit to launch, 26 Sep to 2 Oct 2026, with the old site live as a copy until sign off Measured, source 21. Since then the family edits copy in a Google Doc, and changes go live only on an explicit go ahead to deploy.
kshitijbhatnagar97@gmail.com
No prices here. I scope each setup after I hear how your work runs today.
How these numbers were measured
- Measured
- Observed with a tool or a log.
- Reported
- A person or a document said it; the source names who.
- Modelled
- Computed from inputs shown on the page.
- Example
- An illustration or a default you can change.
- 1
Lab measurement of each home page on desktop: headless Chromium 153 at 1440 by 900, three cold loads per site with the cache off and no CPU or network throttling, on 25 Oct 2026 (IST). Medians: old 4,036,739 bytes in 60 requests, new 444,297 bytes in 18 requests, which at 100 KB a block is 40.4 and 4.4 blocks. Transfer counted until the network went quiet, plus 1.5 seconds, in decimal KB and MB. The old side is the static copy of the old site, because the original server was never measured. The copy loads every image and the map embed at once, where the original loaded them later, and it skips the scripts the original held until the first input. buskers.in, opens the source
- 2
Response headers of https://www.buskers.in/ read on 25 Oct 2026: HSTS with preload, a content security policy, frame options set to deny, content type options, a referrer policy and a permissions policy. The old count is from my audit notes at the takeover on 26 Sep 2026, which record no security headers on the WordPress server. The static copy sends headers of its own, so it cannot stand in for the original here. buskers.in, opens the source
- 3
Every old page address from the crawl of 26 Sep 2026, 36 in all, requested with its trailing slash on 25 Oct 2026. Each answers with permanent redirects (HTTP 308) and ends with HTTP 200 on the matching section of the new page. The old admin addresses lead to the home page. On the same day, the address of every one of the static copy's 215 pages, gallery posts included, matched a redirect rule in the new site's config. Old media file addresses have no redirect. buskers.in, opens the source
- 4
Old: every link on the 37 crawled pages searched for wa.me or WhatsApp, counted on 25 Oct 2026, with no match. New: the WhatsApp handoffs in the page source, which are the floating button, the enrol form and the D'Fest form; the form messages are built in one script.
- 5
Screenshots of the first screen, scrolled to the top. Old, desktop: the original server, captured by my crawl on 26 Sep 2026 before any input. Old, phone: the static copy, captured on 25 Oct 2026 before any tap; it matches the original server's phone capture of 26 Sep 2026. New: buskers.in, captured on 25 Oct 2026 in headless Chromium. On desktop the old hero stayed collapsed until the first mouse move, because its scripts waited for input. buskers.in, opens the source
- 6
Phone load of each home page at 390 by 844 on 25 Oct 2026, counting the call and WhatsApp links visible in the first screen. The original server's phone capture of 26 Sep 2026 shows the same old screen. Smoke checks 9 to 11 confirm that the new bar is fixed, full width and at least 44 px tall. buskers.in, opens the source
- 7
Same lab setup, one run per site on 25 Oct 2026 (IST), each home page scrolled to the bottom and left until the network settled, with analytics hosts blocked. Old: the static copy's home page alone, without the scripts the original held until the first input. New: the whole site, which is one page, with its gallery photos and map tiles. Old 4,337 KiB, new 2,589 KiB as the script reports them, which is 4.44 MB and 2.65 MB in decimal units.
- 8
My one off crawl of the old site on 26 Sep 2026, through its public WordPress REST API and a headless browser: 37 pages, 123 media library files and 74 desktop and phone screenshots, counted on 25 Oct 2026. Upload and edit dates from the same export: 121 of the 123 files were uploaded in 2018, and the newest page edit is dated 8 Apr 2023. My project notes say 129 images; the media list holds 123.
- 9
Pixel heights of the 37 phone screenshots from the crawl of 26 Sep 2026, read on 25 Oct 2026: 7 are exactly 844 px, one screen. I opened two of the seven, the beginner course and the Fusion event, and loaded the beginner course page on the static copy before and after a mouse input.
- 10
Album data of the new site: 218 photos in 5 albums (Fusion 2018: 39, Fusion 2017: 50, D'Fest 2017: 53, BADC Show 2018: 20, More moments: 56), plus 28 photos on the 3D ring.
- 11
My project notes for the takeover, written from 26 Sep to 4 Oct 2026: that the old site ran a custom WordPress theme from 2018 on a cPanel style LiteSpeed host with no firewall in front, the request to keep the old site live until sign off, the reason for each decision, the founder photos found on the Wayback Machine, the first redirects that returned 404 for addresses ending in a slash, the dropped connections behind some office networks, the Google Doc workflow, the rule that nothing deploys without an explicit go ahead, and the launch and rollback steps.
- 12
The mirror workflow and its output: a GitHub Actions runner pinned the domain to the old server's address, copied the site with wget and fetched every address in its four sitemaps, because some pages were linked only by short links. The copy holds 215 pages, gallery posts included, in 967 files of 71,089,079 bytes (71 MB), counted on 25 Oct 2026; my notes say 70 MB. Its hosting config sends four security headers. A static copy cannot run the old enquiry or D'Fest forms.
- 13
An external check from 40 test locations, recorded in my project notes on 26 Sep 2026: the copy on buskers.in loaded from 39 of them, India included. It was a one time reachability check, not an uptime record.
- 14
Lookup of buskers.in through Google public DNS on 25 Oct 2026: both Google mail (MX) records answer from Cloudflare DNS, and the SPF record includes Google's mail servers. My notes record that the old SPF record did not, and that the records went in before the name server switch on 26 Sep 2026. dns.google, opens the source
- 15
Line counts with wc on 25 Oct 2026: about 1,380 lines of the site's own code (1,376 in all: 613 of JavaScript in 10 modules, 296 of CSS and 467 of HTML), 4 front end libraries in the package file, and no server code.
- 16
Studio finder source: the place search is bounded to a box around Jaipur, with a code comment recording that an unbounded search for Vaishali resolved to Bihar; tiles and search come from OpenStreetMap without an API key; studios rank by distance. The old branch list and its embedded maps are in the original home page HTML.
- 17
Old: a census of the HTML saved from the original server on 26 Sep 2026 found one meta description shared by all 37 crawled pages, and no share image on the home page, whose structured data was WebPage, BreadcrumbList, WebSite and Organization. New: the live page's tags read on 25 Oct 2026, with DanceSchool structured data giving the founding year, 1995, and the address, and a 1200 by 630 share card. buskers.in, opens the source
- 18
My optimisation notes of 4 Oct 2026: a Chrome DevTools CPU profile over 8 seconds at the hero, 0.69 ms busy per frame before and after, against a 16 ms frame budget; first load at a phone viewport, 1,647 KB before and 400 KB after the gallery ring moved to load within 800 px of the gallery, units as recorded; JavaScript from one 689 KB file (191.6 KB gzip) to three cached library files plus 5.6 KB gzip of site code.
- 19
Smoke test of 13 Playwright checks at desktop and phone screen sizes and with WebGL switched off: 9 of 12 passed before the call buttons existed, the 3 failures being the buttons; 13 of 13 passed three runs in a row after, and 13 of 13 against the live site at the 4 Oct 2026 deploy.
- 20
Image census on 25 Oct 2026: 10 of the 51 images on the old home page, in the HTML saved on 26 Sep 2026, had no alt attribute; none of the 35 on the new page lacks one, and 6 of those carry an empty alt, which marks them as decorative. Empty alts are not counted as missing.
- 21
Git history and my project notes: first commit on 26 Sep 2026 at 02:05 IST with a preview live the same day, launch on the domain on 2 Oct 2026, and the call buttons and optimisation pass deployed on 4 Oct 2026.
Credits
- Screenshots of the old Buskers site, from its original server on 26 Sep 2026 and from its static copy on 25 Oct 2026, and of buskers.in on 25 Oct 2026. Text, logo and photos belong to Buskers Dance Institute. The old site's design is by its original developers. Phone numbers, branch and studio counts and faces are blurred. buskers.in, opens the source