Ely's Tires and AllOEMRims · 2012 to now

Four generations of
one inventory system

In 2012 I was building the website for a tire shop in South Florida that also sold used factory wheels on eBay. The whole inventory fit in a spreadsheet. The shop was paying a vendor to keep its eBay listings in step with its website, that subscription was canceled on the last day of October 2012, and for three months I kept the inventory by hand while I worked out what a wheel actually is. On 31 January 2013 I wrote the tool in a day. Fourteen years and two rebuilds later the company still runs on it.

This is that run, in date order. Two of the four generations run today and you can open them. One survives as code with no database, so what is shown is a real file it swallowed. Two things are missing and say so: the spreadsheet it all started from, which has not been recovered, and the system running the company right now, which cannot be photographed while real customer records are on every screen of it.

One question, asked four times

This is not four products. It is one question asked four times over fourteen years: what is a wheel, in numbers, such that you can find it, price it and sell it. Everything below is that question being answered better.

2012

The shop

A tire shop in South Florida, family owned, in the tire business since the nineteen sixties and selling to the public since 1999. Mounting, balancing, alignments, brakes, suspension. Tires new and used. And, at the bottom of the welcome copy and nowhere else on the page, an enormous selection of rims.

Nothing on this page dates itself. The footer computes its year, so on a live server today it would claim the present, and the exhibit's clock is pinned to the last date anything in this tree was written. The tree runs from 4 January 2010 to 19 August 2012. The two screens below carry timestamps of their own.

Open Ely's Tires, 2012
www.elystires.com/
The 2012 Ely's Tires home page: a dark header with the shop wordmark, a horizontal navigation bar, a welcome paragraph about the family business, and panels for the shop's Facebook feed and gift cards.
1280 × 843 Open the full picture
20 January 2012

Clone this one, change what is different

The catalog admin behind the site. This particular screen takes a product already in the catalog, copies every field, and hands you the copy to edit. That is the whole Templatizer idea, a year before Templatizer, sitting in a product I was selling to other people at the time.

This screen is version 3 of a content management product my studio sold, not something written for this shop: five other client sites were running the same build, and the admin's footer still carries the studio's name. The date is the file's own date in the archive. Note what is not here. A scan of this whole tree finds no eBay code anywhere: the catalog kept the website, and an outside vendor kept eBay.

Open the catalog admin
www.elystires.com/E8385738T/addSimilarProduct.asp
A 2012 web admin form headed Add Similar Product, with fields for product name, part number, price, quantity, description and images, all prefilled from an existing product.
1280 × 1194 Open the full picture

The wheels did not fit the catalog

A catalog product is built around a thing you have a lot of. A used factory wheel is one of one: this exact wheel, off this exact car, with this exact scratch on it. So the wheels got their own screen and their own database, four months after the screen above.

25 May 2012

The first time the question gets asked

A wheel inventory, separate from the catalog, with its own database and its own way in. Read the headings across the top of the grid. That row is the question this whole business turns on being asked for the first time: which numbers identify a wheel, and which ones sell it. The second icon at the top right is a barcode, and the screen you log in through says scan or enter the item number. In a tire shop. In 2012.

The table this page reads has its own creation date inside its name. Read as a timestamp it is 25 May 2012. The database file was last written on 4 June 2012 and held 341 rows of real stock, so every row you see here is invented and the headings are the real ones. This screen was very nearly published with none of its own furniture: the application was written to sit at the root of its own address, so mounted here every link it makes for itself, including the ones that pull in its own header, pointed one level too high and quietly resolved to nothing.

Open the inventory
www.elystires.com/inventory/inventory.asp
A 2012 inventory grid with sixteen column headings reading Item Number, Days, Location, Qty, Cost, Price, Shipping, Online, Ebay, Size, Width, Pattern, Finish, Condition, Vehicle and Status, above rows of wheels.
Item NumberDaysLocationQtyCostPriceShippingOnlineEbaySizeWidthPatternFinishConditionVehicleStatus
Sixteen headings, 25 May 2012.
1280 × 1414 Open the full picture

31 October 2012. The vendor is canceled.

The shop had been paying an outside company to keep its eBay listings in step with its website, and that company was bad at it. The subscription ended on the last day of October. Nothing replaced it for three months.

November 2012 to January 2013

The spreadsheet the whole system grew out of

For three months there was no system at all. The eBay vendor was gone, the catalog did not do eBay, and the inventory lived in a spreadsheet I built by hand and kept by hand. Those three months are where the thinking happened, and eleven of its thirteen columns are still columns in the live table today.

The two saves either side of the tool are the exhibit. On 30 January it has thirteen columns, and one of them is a checkbox called Posted? that somebody had to tick to remember whether a wheel had been listed yet. The tool was written the next day. By 10 April that column is gone, because the job it existed to track had stopped being anybody's job.

Every surviving save carries one creation stamp, 2012-11-07 16:31:28, so they are a single workbook carried forward rather than separate files.

RIMS 1 30 2012.xlsx and RIMS 4 10 2013.xlsx
ColorPicsLBSSizeBolt PatternVehicle Make / ModelYear(s)OffsetHollanderItem NumberPriceNotesPosted?
ColorPicsLBSSizeBoltVehicle Make / ModelYear(s)OffsetHollanderItem NumberPriceNotes
Thirteen columns on 30 January, twelve on 10 April. The one that went is Posted?, and losing it is the clearest measure of what the tool did.

31 January 2013. Written in a day.

Three months of keeping it by hand is what made a day enough. By then I knew what the columns were, so there was nothing left to work out.

28 February 2014 and 6 April 2014

The tool exists, and it is still learning

Templatizer was written on 31 January 2013, in a day. The earliest copy of it that survives cannot be run: there is no database of any kind in that tree, of any format, so every page dies at the first query. What does survive is what it ate. Eight rim sheets are still sitting in its upload folder, and they are dated, and they are not the same shape as each other.

Five weeks apart, the sheet goes from fifteen columns to twenty eight. One Vehicle and one Years become five of each, because a wheel fits more than one car. One column called TPMPVS splits into tpms and vs, because a sensor and a valve stem are two different things. Imper becomes Imperfections plus repair, skim and, by 2015, Quality, because how bad the damage is and what was done about it are two more. That is the same work the spreadsheet was doing, still going, a year into the tool.

The code in that tree cannot be dated closer than its jQuery, which is 1.10.2, released on 3 July 2013. The sheets can: their names carry their own dates, and the eight of them run from 28 February 2014 to 6 August 2015. So this is the 2013 tool as it stood in 2015, and it is not exhibited here because it cannot be run honestly. Its database was a SQL Server store, two backups of it survive, and restoring one is the next job.

interface/upload/rims2282014.csv and rims462014.csv
ColorPicsSizeBoltVehicleYearsOFSTHollFRTPMPVSItemNumberPartNumberImperPriceNotes
ColorPicsSizeBoltv1y1v2y2v3y3v4y4v5y5steelnonsteelsetoftpmsvsOFSTHollItem NumberPart NumberfrskimImperfectionsrepairPriceNotes
Fifteen columns on 28 February, twenty eight on 6 April. Eleven names are on both, and still on the 2015 sheet a year later: Color, Pics, Size, Bolt, OFST, Holl, FR, ItemNumber, PartNumber, Price, Notes.

Then it just ran

There is no frame for 2016, 2017 or 2018, because nothing changed in those years that a screenshot would show. The tool was finished and the shop was busy. What did change is what it was pointed at: by the end it was running AllOEMRims.com rather than a page on a tire shop's website.

2019 to 2020

Six years of being used every day

The same tool, grown up. The home page is a board of wheels that have been described but not listed anywhere yet, with a counter for how far behind the shop is, and one button that pushes all of them at once. Down the left is every other thing the job turned out to need: a second product family, a third, an importer, a template library, an archive, an item number generator.

This copy is dated by its own working files. Thirty seven item number exports sit in it with dates in their names running from 28 May 2019 to 11 August 2020, and the upload folder carries sheets from 2019 and 2020. Its own notes say it ran on a web server in the shop until it was rebuilt as a WordPress plugin in early 2026.

Open Templatizer, the classic build
templatizer.elysstuff.com/
The Templatizer dashboard: a wordmark, a left navigation column listing product families and tools, and a table of listings in progress with title, item number, used price, refurbished price and date columns.
1280 × 1814 Open the full picture
2019 to 2020

What it was actually for

This is the screen the whole thing exists to produce. One wheel goes in, and out comes the listing: the title built to the character limit, the item specifics, and a block of description markup ready to paste into a marketplace listing. Describe the wheel once, in one place, then let the machine write it out however each channel wants it.

This page nearly did not make it into the exhibit. It builds its description by pulling in a separate file of template code from inside a block of script, which is legal in the original and was not something the converter handled, so the most important screen in the tool was coming out as an apology. That is fixed, and the fix is in the converter rather than in this copy.

Open the listing generator
templatizer.elysstuff.com/get-template/rims/
A Templatizer screen headed Get Codes, showing a generated listing title, a table of item specifics for a wheel, and a text area holding the description markup for the listing.
1280 × 1503 Open the full picture
2019 to 2020

And then it was not only wheels

A center cap is the small cover that snaps into the middle of a wheel. Look at what this screen does not ask for: no bolt pattern, no offset. It asks how many clips, and which part number is stamped on the back, because that is what identifies a cap. Same machinery, completely different questions. Bike tires, car tires, hubcaps, bumpers and emblems followed. The box across the top takes a part number and fills the rest of the form in for you, which is the first ancestor of the intake that runs today.

The database this ran on held 2,750 wheels, 4,091 bike tires, 104 center caps, 19 car tires and one emblem. Every row in the exhibit is invented, the row counts are the real ones, and there was never a customer table in it: this tool described things, it did not sell them. One file in this module is the only damaged file in the whole tree, and there is a page at its address saying so.

Open the center caps
templatizer.elysstuff.com/add/caps/
The Templatizer add a center cap form, with fields for part number, number of clips, finish, fitment years and vehicles, and no wheel measurements at all.
1280 × 1108 Open the full picture

Early 2026. The whole thing is rebuilt.

Thirteen years of classic ASP on a web server in the shop, replaced by a WordPress plugin. Second rebuild, same question.

Live right now

Templatizer 3. No picture yet.

The fourth generation, and the one actually running the company while you read this. It is the only frame here with no photograph, and the reason is not that it is missing.

Still in production, not photographed

The current one is a WordPress plugin. Its own version constant reads 3.126.0.0. It is not a listing tool any more: it is the ledger the books are kept in, the pull list the warehouse opens in the morning, the label printer, the pricing engine, the storefront, the support desk and, last of all, the thing that answers the phone.

There is no screenshot of it here, and that is deliberate rather than unfinished. It is a working business, so every screen worth showing has a real customer's name, address and order history on it. Blurring can be undone. The honest way to photograph it is to stand a copy up on invented data, and that copy does not exist on this machine yet.

When those screenshots are made, they belong here, at the end of the run.

And it is still selling while you read this

Fourteen years in production, and the business is winding down: the assets are being sold. Production is still live. I built and ran the platform, I have never owned any part of the company, and the last thing I shipped to it answers the telephone.

Where all of this came from

The screenshots

Every screenshot on this page is a photograph of a page that runs. The archived source was converted to something a current web server can execute, served locally, and rendered in a browser at 1280 pixels wide. Nothing is a mockup and nothing is redrawn.

Every row of data behind them is invented. The original databases hold a real shop's real stock, so the tool reads them only to learn their shape, and then writes new rows into it: the same tables, the same number of rows, none of the same values. The headings, the labels and the layout are the real ones. The wheels are not.

How each date is known

  • 2012, the shop's site. Nothing on the page dates itself. The archive dates the files in that tree from 4 January 2010 to 19 August 2012.
  • 20 January 2012, the catalog. The file's own date in the archive.
  • 25 May 2012, the inventory. The database table this screen reads carries a timestamp in its own name, which decodes to that day. The file holding it was last written on 4 June 2012.
  • 31 October 2012 and 31 January 2013. Mine, and not in the archive. Those two dates come from me.
  • 2014 and 2015, the rim sheets. The file names carry their own dates. Eight of them survive, running from 28 February 2014 to 6 August 2015.
  • 2019 to 2020, the classic build. Thirty seven item number exports carry dates in their names, from 28 May 2019 to 11 August 2020, and the upload folder carries sheets from 2019 and 2020.
  • Early 2026, the rebuild. The classic build's own notes say so, and they say it approximately, so this page does too.

The eleven columns

Three rim sheets survive with three different column sets. Folding case and spaces, eleven names appear on all three: Color, Pics, Size, Bolt, OFST, Holl, FR, ItemNumber, PartNumber, Price and Notes. Four names from the February 2014 sheet are gone by April: Vehicle, Years, TPMPVS and Imper, each of them replaced by something finer.

That is a measurement of these three files and nothing more. It is not the same eleven as the eleven of thirteen in the story above, which is about the hand kept spreadsheet and the live table today, and which cannot be checked here because the spreadsheet is missing.

What is not here, and why

The spreadsheet has not been recovered. It is not in the archive, not in the backups, and not on any disk that has been searched. If it turns up it goes in the frame that is holding its place.

The first Templatizer is not an exhibit. Its code survives in full and parses clean, but there is no database of any kind in that tree, of any format, so every page of it dies at the first query. Its data does survive, separately, as a SQL Server backup, and when that is restored and proved to hold nobody's details, the tool becomes an exhibit like the other two. It is not shown running on a database borrowed from a later version.

The current system is not photographed. It is a live business with real orders in it, and the only honest way to show it is a copy running on invented data.

Two pieces of the classic build are left out of its exhibit and say so at their own addresses: a second application for the shop's non factory stock, which has its own database and its own mailing list, and one exporter that reaches out of the archive into a system that is still running.

And one page of the classic build is simply destroyed. The center cap listing board is 4,649 bytes of noise in the archive, with no readable text in it and no header saying what it used to be, and it is the only damaged file among the 154 there. A file of the same name and exactly the same size survives in a different copy of the tool, but that copy differs from this one in every other file compared, so it is not laid in. There is a page at the address saying what happened, and the rest of the center caps module runs.