2026-06-09 13:41:27 -07:00
# Camera Spec Card Generator
2026-06-10 10:34:13 -07:00
**Turn any photo or Siril FIT file into a shareable camera spec card.**
2026-06-09 13:41:27 -07:00
2026-06-10 10:34:13 -07:00
Drop a photo for your background. Optionally drop a Siril FIT file. We'll read its EXIF metadata and generate a beautifully formatted 1080× 1080 overlay with your shooting data — no account, no upload, no server. Just one HTML file.
2026-06-09 13:41:27 -07:00
2026-06-10 10:34:13 -07:00
🔗 ** [Try it live → justinoros.github.io/spec-card ](https://justinoros.github.io/spec-card/ )**
2026-06-09 13:41:27 -07:00
---
2026-06-09 13:52:16 -07:00

2026-06-09 13:41:27 -07:00
---
## Features
- **Drag & drop or browse** — JPEG, PNG, TIFF, CR2 RAW, and FITS files
- **Auto-reads metadata** — EXIF for camera photos, FITS headers for Siril exports
- **Astrophotography fields** — camera, telescope, lens, focal length, aperture, filter, shutter, frames stacked, total integration, ISO/gain, object, location, Bortle scale, and date
- **Smart background handling** — images without EXIF data are used as the card background without overwriting your spec fields
2026-06-10 10:34:13 -07:00
- **Interactive drag-and-drop layout** *(desktop)* — drag any spec row, the header text, footer text, or separator lines to reposition them anywhere on the card with 40px grid snapping
- **Trash to delete** — drag any element to the trash icon that appears while dragging to remove it from the card
- **Click any field on the card** to edit it inline *(mobile)* , or use the edit panel below *(all devices)*
- **Live updates** — every keystroke and slider adjustment instantly re-renders the card
2026-06-09 13:41:27 -07:00
- **Two-column layout** — automatically activates when 8+ fields are populated
- **Text size and background blur sliders**
2026-06-10 10:34:13 -07:00
- **Label & header size slider** — independently control the size of labels, header, and footer text
2026-06-09 13:41:27 -07:00
- **Custom icon and text colors** via hex input
2026-06-10 10:34:13 -07:00
- **Header and footer line toggles** — show or hide the separator lines independently
- **Editable header and footer** — change "SPEC CARD" to your target name, and the footer to your IG handle, YouTube, or website
- **Footer text saved to localStorage** — set it once, auto-populates on every future visit
2026-06-09 13:41:27 -07:00
- **Downloads as a timestamped 1080× 1080 JPEG** — `camera-spec-card-YYYYMMDD-HHMMSS.jpg`
- **Zero dependencies at runtime** — everything runs in the browser, nothing is sent to a server
---
## Usage
### Option 1 — Use the hosted version
2026-06-10 10:34:13 -07:00
Visit ** [justinoros.github.io/spec-card ](https://justinoros.github.io/spec-card/ )** — no installation needed.
2026-06-09 13:41:27 -07:00
### Option 2 — Self-host or run locally
1. Clone or download this repo
2. Place your own background image as `bg.jpg` in the same folder (optional)
3. Open `index.html` in any modern browser — that's it
```
spec-card/
2026-06-10 10:34:13 -07:00
├── index.html ← the entire app
├── bg.jpg ← background wallpaper (optional, replace with your own)
└── screenshot.jpg ← shown in this README
2026-06-09 13:41:27 -07:00
```
---
## Supported File Types
| Format | Metadata Source | Image Preview |
|--------|----------------|---------------|
| JPEG / PNG | EXIF | ✅ Used as card background |
| TIFF (8-bit / 16-bit) | TIFF IFD tags | ✅ Used as card background |
| CR2 / CR3 RAW | Embedded EXIF | ✅ Embedded JPEG preview extracted |
| FITS / FIT | FITS header keywords | ❌ Gradient placeholder (drop a separate image to set background) |
> **TIFF note:** 32-bit float TIFFs (Siril's default linear export) are not supported. Export as 16-bit or 8-bit TIFF from Siril before use.
---
## FITS Keywords Read
When a `.fit` or `.fits` file is loaded, the following header keywords are extracted automatically:
| Card Field | FITS Keywords |
|---|---|
| Camera | `INSTRUME` |
| Lens | `LENS` , `OPTICS` |
| Focal Length | `FOCALLEN` , `FOCAL` |
| Aperture | `FOCRATIO` , `APERTURE` |
| Filter | `FILTER` , `FILT` |
| Shutter / Exposure | `EXPTIME` , `EXPOSURE` |
| Frames Stacked | `STACKCNT` , `NCOMBINE` , `NFRAMES` |
| Total Integration | `TOTALEXP` |
| ISO / Gain | `ISO` , `GAIN` |
| Object | `OBJECT` , `TARGET` |
| Location | `SITELAT` + `SITELONG` |
| Bortle Scale | `BORTLE` , `SQMVALUE` |
| Date | `DATE-OBS` , `DATE` |
Any fields not present in the file can be filled in manually using the edit panel.
---
## Recommended Workflow for Astrophotography
1. **Drop your background image** (exported PNG/TIFF from Siril, or any photo) — used as the blurred background
2. **Drop your FITS file** — populates all available spec data without replacing the background
3. **Fill in any missing fields** in the edit panel (Bortle, location, total integration, etc.)
2026-06-10 10:34:13 -07:00
4. **Drag elements** to reposition them on the card *(desktop only)*
5. **Adjust** text size, blur, and colors to taste
6. **Download** your 1080× 1080 spec card and share alongside your image on Instagram
---
## Desktop Drag & Drop Layout
On desktop (mouse/trackpad), every element on the card is draggable:
- **Hover** over any field to reveal the grab cursor
- **Drag** to reposition — elements snap to a 40px grid when released
- **Header and footer separator lines** can be dragged vertically
- A **trash icon** appears below the card while dragging — drop any element on it to remove it from the card
- Typing into a field after removing it will bring it back
- All positions are preserved across re-renders until you load a new file
2026-06-09 13:41:27 -07:00
---
## Customization
2026-06-10 10:34:13 -07:00
All fields on the card are editable — tap directly on the card *(mobile)* or use the panel below it:
2026-06-09 13:41:27 -07:00
- **Header** — defaults to `SPEC CARD` , change to your target name or session title
2026-06-10 10:34:13 -07:00
- **Footer** — defaults to `@FateOfAstrophilia` , change to your IG, YouTube, website, or anything — saved automatically to localStorage
2026-06-09 13:41:27 -07:00
- **Icon color** — any 6-digit hex (default `#c8a96e` )
- **Text color** — any 6-digit hex (default `#e8eaf0` )
2026-06-10 10:34:13 -07:00
- **Label & header size** — slider from 60% to 140% (default 140%)
- **Value text size** — slider from 60% to 140% (default 100%)
- **Background blur** — slider from 0px (sharp) to 60px (default 5px)
- **Header line** / **Footer line** toggles — show or hide separator lines independently
2026-06-09 13:41:27 -07:00
---
## Built With
- Vanilla HTML, CSS, and JavaScript — no framework, no build step
- [EXIF.js ](https://github.com/exif-js/exif-js ) — JPEG/PNG EXIF parsing
- [UTIF2 ](https://github.com/photopea/UTIF.js ) — TIFF decoding
- Custom binary EXIF parser for CR2 RAW files
- Custom FITS header parser
---
## License
MIT — free to use, fork, and modify.
---
*Made with ❤️ by [Justin Oros](https://www.instagram.com/FateOfAstrophilia) · [@FateOfAstrophilia](https://www.instagram.com/FateOfAstrophilia)*