No camera running.
Connect the digital microscope and press Start.
Overlapping NEAR frames on the XY stage, assembled into one large full-card image. Set the column to NEAR and refocus first — the grid below is sized from that scale.
No camera running.
Connect the digital microscope and press Start feed.
No capture for this corner yet.
Start the feed and press Capture.
Job Summary
review & generate report
Card
centering analysis
My Cards
Cards registered to · 0 total
Records
All customers
Track your card
Enter the track number from your receipt — no account needed.
Verify a report
Enter the card ID printed on the lab report (e.g. BL000001NN).
Settings
Stored on this device — overrides js/config.js.
Every status email sent to a customer is copied here, so you can confirm it actually went out. Leave blank to send no copy. Stored on this device, so each admin can use their own address.
Overrides the sender. The address must be on a domain you have verified at Resend, otherwise the send is refused. Leave blank to use the server setting.
While this has an address, no customer receives anything — every notification is redirected to it and the subject is marked [TEST] with the intended recipient. Clear it before going live.
Resend will only deliver to the address that owns your Resend account until you verify a domain. There is no way to allow extra recipients — domain verification is the only route. DEPLOY.md § E3.
Cloud records keep every measurement and grade. Captured images stay on the device that shot them (Firestore document limit).
Powers One Piece search. Create a free account at apitcg.com/register, open the Developer Platform → API Key, paste it here. Stored on this device only.
The level Ctrl+Left Click jumps to, centred on the cursor. Applies to every live view; saved instantly on this device.
Live view hotkeys — the same on CENTERING, INSPECTION and STAGE/CAM:
Wheel — zoom in 25% steps · Ctrl+Wheel — fine 5% steps (up to 1200%)
Ctrl+Left Click — jump straight to the level above, centred on the cursor
Right-Drag — pan while zoomed · Right Click — back to 100%
▦ GRID — toggle the reference grid · the zoom % reads top-right while zoomed
Left-Drag (INSPECTION only) — box a defect: the box previews in negative, releasing offers MINOR / MAJOR to capture it
Admins (everything, incl. this page) are fixed in ADMIN_EMAILS in js/config.js and adminEmails() in firestore.rules — edit both and republish the rules to change them. Agents get SUBMISSION, DASHBOARD, INSPECTION, STAGE/CAM, BLACKBOARD, BLACKVAULT and GUIDE — everything except Settings — and are granted below. Anyone else who registers is a customer (BLACKBOARD); a viewer with no account opens BLACKVAULT by Job# or the slab’s QR.
No camera running.
Pick the microscope in the Camera panel and press ON.
Ruler laid ACROSS the view · drag the guides, or right-drag a box over clean graduations.
—
Type scale 6 steps, replacing the 17 sizes in the app today
Spacing every gap, pad and margin comes from these
Radius three, not ten
Control heights buttons and inputs align because they share these
Colour already systematised — shown so a change here is visible everywhere
Buttons
Fields
Status
Cards plain, and collapsible (chevron left of the title)
Body text at the small step. A panel that never folds — the operator always needs it.
Click the header to fold. State persists per card id.
Readouts
| MACHINE | WORK | |
|---|---|---|
| X | 50.001 | 0.001 |
| Y | 50.001 | 0.001 |
Live view the 9/16 box and its centred grid — identical on CAMERA and STAGE
| ATTRIBUTE | DESCRIPTION |
|---|---|
| — | |
No camera running.
Start the microscope on any capture step and it appears here.
| MACHINE | WORK | |
|---|---|---|
| X | — | — |
| Y | — | — |
| Z | — | — |
BLACKLENS Guide
Pick a topic. Bench work, running jobs, customer tracking, and admin setup.
FAR (28 cm) · the whole front. This shot is the card’s identity everywhere else.
NEAR (14 cm) · four edge shots, cut + print guide on each.
NEAR · four corner shots, tick the defects you can see.
Flip the card once, here. Four back corners.
NEAR · the four back edges.
FAR · the whole back, plus the combined defect map for both sides.
Final pre-grade, pillar scores, defect maps — and Generate Report.
The card is flipped exactly once, between steps 3 and 4. Everything before the flip is the front; everything after is the back.
Press Capture first — ticks go on the frozen shot, not the live feed. Each tick stores a small close-up that appears in the report.
Whole-card shots (steps 1 and 6). The card sits inside the frame with a little room to spare.
Centering and Inspection (steps 2–5). One edge or one corner fills the frame.
The wizard walks it in order: FAR scale → NEAR scale → FAR lens → NEAR lens. Freeze a ruler, drag the two guides 10 mm apart, press Set scale.
Every lens bows straight lines, and centering measures exactly where the bow is worst — an uncorrected lens fakes a centering error. Auto-correct finds it; the before/after slider on the stage shows the difference.
Calibration is saved per bench, not per card. Re-run it only if the height, zoom or focus changes.
Radial distortion only bends off-centre lines. If the ruler is straight and centred, auto-correct correctly finds nothing — move it toward an edge and try again.
LEFT → RIGHT → TOP → BOTTOM. Next Edge advances for you and moves on to the next step after the fourth.
Dashed = cut edge, solid = print border. LEFT: cut left / print right · RIGHT: cut right / print left · TOP: cut top / print bottom · BOTTOM: cut bottom / print top.
Drag a box across the border with the right button. On release both guides snap to the two strongest lines inside it.
Click a line to select it, then nudge with the arrow keys (Shift ×10). The loupe follows the selected line and the width in px floats between the guides.
Only a small crop of the measured border, not the whole 4K frame — that is what keeps a job small enough to save reliably. The measured width itself is taken at full resolution, so accuracy is unaffected. To re-measure a saved edge, press Recapture.
Put the card’s corner in the dashed guide and press Capture to freeze it. Each shot reaches past the middle of the card, so the four together cover the whole surface.
Left click = major, Ctrl = minor, Shift = surface, Alt = edge. The loupe magnifies as you aim.
The guide frame tells the app where on the card you were looking, so each tick is plotted automatically onto the Front/Back Full-Card image. Two ticks in the same spot plot once.
Graders do not average. One bad corner caps the whole pillar, so mark honestly — the score follows the marks.
Manage → put the customer’s email on the card. That email is the link: when they register with it, their card appears in their account automatically and a ✓ shows in the Owner column.
Pre-Grading (we assess it), Grading (we send it on), or Both. This changes who issues the final grade — see below.
Received → Pre-Graded → Submitted → Graded → Returned, plus On Hold / Issue for anything stuck. Changing it notifies the customer and updates their public tracker.
The note is shown to the customer. Use it for the reason on a hold, or the courier on a return.
Narrow to one customer, one status, or one service. Search matches track #, card, owner and certificate number.
BLACKLENS is the issuing authority. There is no third party, so the official grade is our own pre-grade and the certificate number is generated from the track number:
#BL000069NN → BL 9.5 · cert BL-000069
The grade fields fill in and lock themselves. Nothing to type.
A real grading company issues the grade. Record their company, grade and certification #, plus the submission details so the customer can see where the card is.
For PSA, type the cert number and press Fetch from PSA to pull the official result. PSA can only look a card up by cert number — there is no search by name.
The fastest option. They open the tracking page and type the number from their receipt.
blacklens-app.vercel.app/#/track
They see the card, the status timeline with dates, the pre-grade, the official grade and the submission — and nothing about any other customer.
Print this link and the track number on every receipt.
For regulars. They create an account on the sign-in screen, verify the email, and every card logged to that address appears under My Cards.
They can also switch on email and LINE alerts, so a status change reaches them without checking.
The email on the record must match the one they register with — that is the link.
Hi — your card is now with BLACKLENS. Your track number is: #BL000000NN Follow its progress any time here: https://blacklens-app.vercel.app/#/track Just enter the track number — no account needed. Want alerts instead of checking? Create a free account with THIS email address at https://blacklens-app.vercel.app, verify it, and your card appears under "My Cards". You can switch on email or LINE notifications there and we'll message you at every step. Thank you, BLACKLENS
Tick Message me on LINE, then press Save preferences.
They add the BLACKLENS LINE Official Account as a friend (show them the QR code).
My Cards shows a code like BL-AB12CD. They send it to the account as a message.
The bot replies “Linked ✓” and the badge turns green. Every status change now arrives in LINE.
LINE requires the friend-add and the code because LINE only reveals a user’s ID once they message the account first. There is no way around it.
- See status, dates, pre-grade, official grade and submission details
- Enter a grade they obtained elsewhere (it is marked CUST)
- Choose email and/or LINE alerts
- Change status, owner or any measurement
- See another customer’s cards
- See the microscope captures — those stay on the bench machine
Publish the security rules. Until you do, saving a status shows tracking failed: 403 … PERMISSION_DENIED because the public tracking area does not exist yet.
- Open the Firebase console → your project → Firestore Database → Rules.
- Delete what is there and paste the entire contents of firestore.rules from the project folder.
- Press Publish.
- Back in BLACKLENS, change a status again — it should say tracking published.
The first time a customer opens My Cards, Firestore will ask you to create one index. Click the link it gives you; it takes under a minute.
Everything below is off until you add its key in Vercel → Settings → Environment Variables, then redeploy. Nothing breaks while a service is off — the app just says not-configured and you carry on by hand. Full step-by-step for each is in DEPLOY.md.
Sign up at resend.com, create an API key, add RESEND_API_KEY and NOTIFY_FROM. Until then status changes report email not-configured. Takes about five minutes.
Create a LINE Official Account and Messaging API channel, point its webhook at /api/line-webhook, add the channel secret, token and a Firebase service-account key. The longest of the four.
Get a token from psacard.com/publicapi and add PSA_API_TOKEN. Only affects the Fetch from PSA button — typing a grade by hand always works. Note PSA tokens expire and need regenerating.
Add FIREBASE_API_KEY only if you want /api/status to answer as JSON for another system. The customer tracking page does not need it.
Four groups. Admin (emails in ADMIN_EMAILS, js/config.js, or a staff/{uid} doc): the full studio including Settings. Agent (granted from Settings → Access, or AGENT_EMAILS): every module except Settings. User (anyone who registers): the customer portal — their own submissions and certificate checks. Guest (no account): the Verify and Track links on the login page.
To change admins: edit ADMIN_EMAILS in js/config.js and adminEmails() in firestore.rules, then re-publish the rules. Agents need no redeploy — the Access card writes agents/{email} docs.
| Message | Meaning |
|---|---|
| tracking published | The public tracker is live for this card. All good. |
| tracking failed: 403 | Rules not published yet — see Start here above. |
| email sent | Delivered to Resend. If it did not arrive, check spam. |
| email not-configured | No RESEND_API_KEY yet. Expected until you do § E. |
| domain-not-verified | Resend is still on its shared test sender, so it can only mail you. The customer got nothing; you got a copy marked [not delivered to customer]. Verify blacklens.studio at resend.com → Domains, set NOTIFY_FROM to an address on it, redeploy. DEPLOY.md § E3. |
| line no-linked-account | The customer has not sent their code to the LINE account yet. |
| Saved on this device… | You are not signed in to the cloud, so there is nothing to publish to. |
Never refocus between opposite edges — the ratio breaks silently.
Auto-align before capturing — a skewed edge fakes a centering error.
Dust reads as scratches under magnification.
Angled light reveals whitening and scratches that head-on light hides.
Graders do not average — one bad corner caps the pillar.
A perfect front with a 65/35 back is not a Black Label.