This is a static, single-page personal link portfolio (Bento-style) built as a self-hosted alternative to Bento.me before its shutdown (February 13, 2025). The site replicates the original Bento layout with custom styling and properly organized assets.
Live Site: https://ionut85.github.io
We implemented three distinct card types with fixed dimensions:
- Small cards (189px × 175px): Single column, vertical layout with icon on top
- Wide cards (390px × 175px): Two-column span, horizontal layout with icon/text on left, preview image (178px × 127px) on right
- Compact cards (390px × 67.5px): Two-column span, horizontal layout with icon on left, no domain text
Grid Calculation:
- Base column: 189px
- Gap: 12px
- Wide/compact width: 189px + 12px + 189px = 390px
Critical Decision: All cards maintain fixed dimensions across all screen widths. They do not resize or reflow internally - only their grid positioning changes.
Breakpoints:
- Mobile (< 640px): Cards center-aligned, stack vertically in single column (auto-fit)
- Tablet (640px - 899px): 2-column grid (378px + 12px gap = 390px total)
- Desktop (900px+): 4-column grid (756px + 3 gaps = 792px total)
Layout principle: Cards reflow like Bento - they move under each other as screen narrows, but maintain exact pixel dimensions.
Workflow established:
- Download images from live Bento page or source URLs
- Use descriptive naming:
{project}-icon.{ext}and{project}-preview.{ext} - Replace all generic
image_XXXreferences with named files - Store in
/assets/images/directory
Icon specifications:
- Size: 40px × 40px (consistent across all card types)
- Border-radius: 10px
- Padding: 8px
- Background: var(--bg-color) with subtle shadow
Preview image specifications (wide cards only):
- Size: 178px × 127px
- Border-radius: 10px
- Object-fit: cover
- Position: Right side of card
Unique implementation:
- Full background image spanning entire card (390px × 175px)
- No visible text or icon elements
- Uses
.card--backgroundmodifier class with inlinebackground-imagestyle - CSS hides
.card__bodyand.card__imageelements
Steps:
- Used Task agent to fetch live Bento page (https://bento.me/ionut)
- Extracted all image URLs using WebFetch and Grep
- Downloaded 29+ properly-named images:
- Social icons: twitter-icon.png, linkedin-icon.svg, instagram-icon.svg, medium-icon.svg, github-icon.svg
- Project icons: hypd-icon.png, noah-icon.png, adcp-icon.svg, etc.
- Preview images: hypd-preview.png, noah-screenshot.jpeg, incrmntal-preview.jpeg, etc.
- Created
image-mapping.jsonfor traceability (Bento URL → local filename) - Updated all
image_XXXreferences in index.html to named files
Result: Zero generic image references remain (verified with grep)
Problem: LinkedIn, Instagram, Medium showed broken images (tiny PNGs)
Solution:
- Downloaded official SVG icons from SuperTinyIcons repository
- Updated references from
.pngto.svg:linkedin-icon.png→linkedin-icon.svginstagram-icon.png→instagram-icon.svgmedium-icon.png→medium-icon.svgspotify-icon.png→spotify-icon.svg
Changed from generic to specific:
- Twitter: "Twitter" → "Ionut Ciobotaru" (@weeb0)
- LinkedIn: "LinkedIn" → "Ionut Ciobotaru - iion | LinkedIn"
- Medium: "Medium" → "Ionut Ciobotaru – Medium"
- Replit: "Replit" → "cionut (cionut)"
- GitHub: "GitHub" → "ionut85"
- Instagram: "Instagram" → "@cionut"
Added preview images to wide cards:
- Noah Pretzels:
noah-large.jpg→noah-screenshot.jpeg(corrected) - AdCP: Added
adcp-preview.png - IndieGrow: Renamed
image_086.png→indiegrow-preview.png - First Party Capital: Renamed
image_081.jpeg→firstpartycapital-preview.jpeg - AdTech Cares: Renamed
image_038.jpeg→adtechcares-preview.jpeg(also used as icon) - Prebid: Renamed
image_080.jpeg→prebid-preview.jpeg - IAB Europe: Renamed
image_061.png→iab-preview.png - VentureBeat: Downloaded from
gamesbeat.com/wp-content/uploads/2025/05/titleimage.png
Downloaded specific icons from source URLs:
- Inspector Gadget:
https://inspectorgadget.info/favicon.ico - Windows PC Romania: Facebook CDN URL (8.5KB PNG)
- Take A Trip: Facebook CDN URL (29KB JPG)
- Applift:
https://media.pocketgamer.biz/images/55315/66078/applift-logo_s470.webp - VentureBeat:
https://images.icon-icons.com/2699/PNG/512/venturebeat_logo_icon_167688.png - Monetaria Statului: Downloaded from Bento (was 0 bytes, fixed to 13KB)
Issue: Cards had inconsistent sizing, didn't match original Bento
Solution applied exact specifications:
.card--wide {
width: 390px;
height: 175px;
padding: 24px;
}
.card--compact {
width: 390px;
height: 67.5px;
padding: 20px 24px; /* top/bottom: 20px, left/right: 24px */
}
.card--small {
width: 189px;
height: 175px;
padding: 24px;
}
.card--wide .card__image {
width: 178px;
height: 127px;
}Grid columns adjusted: 189px each with 12px gap
Problem: Content appeared left-aligned on wider screens
Solution:
- Added
justify-content: centerto.cardsgrid - Made
.sectiona flexbox column with centered alignment - Set section title max-widths to match grid width at each breakpoint:
- Tablet:
max-width: calc(2 * 189px + 12px)= 390px - Desktop:
max-width: calc(4 * 189px + 3 * 12px)= 792px
- Tablet:
Changed: Compact card icons from 28px × 28px to 40px × 40px to match all other cards
Before:
.card--compact .card__icon { width: 28px; height: 28px; }After:
.card--compact .card__icon { width: 40px; height: 40px; }Critical decision: Remove all responsive card resizing
Changes made:
- Removed mobile overrides that changed card dimensions
- Set fixed widths on all card types
- Changed grid from
1frtorepeat(auto-fit, 189px)on mobile withjustify-content: center - Cards now maintain exact dimensions and simply reflow into fewer columns as screen narrows
Result: Bento-like behavior where cards stack but don't resize
ionut85.github.io/
├── index.html # Main production file (654 lines, all CSS inline)
├── CLAUDE.md # Claude Code guidance (updated)
├── DEVELOPMENT_LOG.md # This file - complete development history
├── README.md # User-facing documentation
├── index-simple.html # Backup/reference version
├── bento_source.html # Original Bento export (12,511 lines)
├── links.json # Structured data (not currently consumed)
├── assets/
│ └── images/ # 139 total images (12MB)
│ ├── profile.jpg # Profile avatar
│ ├── banner.jpeg # Cover image
│ ├── open-internet.jpeg # Special background card
│ ├── *-icon.{svg,png,jpg,ico} # 70+ named icon files
│ ├── *-preview.{png,jpg,jpeg} # 25+ preview images
│ ├── *-screenshot.jpeg # 15+ screenshot images
│ └── image-mapping.json # Bento URL → local file mapping
├── urls.txt # Reference list of all URLs
└── extracted_images.txt # Image inventory from Bento
--bg-color: #f5f5f5; /* Light gray page background */
--card-bg: #ffffff; /* White cards */
--text-primary: #1a1a1a; /* Near-black text */
--text-secondary: #666666; /* Gray text */
--text-tertiary: #999999; /* Light gray */
--border-radius: 16px; /* Card corners */
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);
--shadow-hover: 0 8px 24px rgba(0, 0, 0, 0.12);- Font stack:
-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto' - Section titles: 20px, font-weight 700
- Card titles: Default (varies by card type)
- Compact card titles: 14px
.container (max-width: 1400px, centered)
└── .layout (grid: sidebar + content)
├── .profile (320px sidebar, sticky on desktop)
└── .content (1fr main content)
└── .section (centered flex column)
├── .section__title
└── .cards (grid: auto-fit → 2 cols → 4 cols)
└── .card variants (fixed dimensions)
-
Entrepreneuring (current projects) - 4 cards
- HYPD.ai (wide) - AI for performance marketers
- Noah Pretzels (wide) - Food product company
- The Turing Marketer (wide) - Substack newsletter
- AdCP (wide) - Open advertising standard
-
Blogging, Marketing, Developing - 7 cards
- Open Internet (wide, background image) - Advocacy
- Twitter (small) - Ionut Ciobotaru
- LinkedIn (small) - Ionut Ciobotaru - iion
- Medium, Replit, GitHub, Instagram (all compact)
-
Media - 8 cards
- AdExchanger article (wide)
- VentureBeat article (wide)
- YouTube podcast (wide)
- Slideshare white paper (wide)
- ID5 IDENTITY 2023 (wide)
- IAB UK article (wide)
- IAB Europe trends (wide)
- Spotify podcast (wide)
-
Events & Memberships - 5 cards
- MMA Global Speaker (wide)
- Meetup Berlin AdTech (wide)
- AdTech Cares (wide)
- Prebid.org (wide)
- IAB Native Predictions (wide)
-
Investments - 14 cards
- INCRMNTAL (wide) - Primary investment
- NumberEight AI, IONIQ, Verve Group/MGI (wide) (small/wide)
- Kayzen, Reflect, Take A Trip, Context SDK, iion, Substack, PubStation, FI Mentor, Replit, AI Fund (all small)
- First Party Capital (wide)
-
Past Projects - 11 cards
- PubNative, Verve, Applift, MGI, Inspector Gadget, IT Genetics, ITG Store, Bettahub, Gave.ro, Super Pantofi, Monetaria Statului, Windows PC Romania (all small)
- IndieGrow (wide)
No build process required - site is pure static HTML/CSS
# Make changes
git add .
git commit -m "Description of changes"
git push origin master
# GitHub Pages auto-deploys from master branch
# Live within 1-2 minutes at https://ionut85.github.io- Single HTTP request
- No build step needed
- Immediate time to interactive
- Easy to maintain for single-page site
- Pure content display (no interactivity needed)
- Maximum performance
- SEO-friendly
- Works without JS enabled
- Matches original Bento behavior
- Predictable layout across devices
- Professional appearance
- Easier to maintain (no complex responsive logic)
- Maintainability: Easy to find/replace images
- Clarity: Obvious what each file is for
- Version control: Meaningful diffs
- Future-proofing: No conflicts with numbered files
<a href="URL" class="card card--wide" target="_blank" rel="noopener">
<div class="card__body">
<img src="assets/images/project-icon.png" alt="" class="card__icon" loading="lazy">
<h3 class="card__title">Project Title</h3>
<span class="card__domain">domain.com</span>
</div>
<img src="assets/images/project-preview.png" alt="" class="card__image" loading="lazy">
</a><a href="URL" class="card card--small" target="_blank" rel="noopener">
<img src="assets/images/project-icon.png" alt="" class="card__icon" loading="lazy">
<h3 class="card__title">Project Name</h3>
<span class="card__domain">domain.com</span>
</a><a href="URL" class="card card--compact" target="_blank" rel="noopener">
<img src="assets/images/project-icon.png" alt="" class="card__icon" loading="lazy">
<h3 class="card__title">Project Name</h3>
</a>Edit index.html around lines 237-250
Edit CSS variables in :root (lines 12-21)
- Start with exact specifications - Getting pixel-perfect dimensions early saved multiple iterations
- Descriptive naming matters - Generic image_XXX files caused confusion and errors
- Fixed layouts are simpler - Less CSS complexity than fully responsive cards
- SVG icons > PNG - Better scaling, smaller file sizes, crisper rendering
- Center alignment critical - Fixed-width grids need explicit centering
- Document as you go - This log captures decisions that would be lost otherwise
- Dynamic rendering from links.json using JavaScript
- Dark mode toggle
- Image optimization pipeline (build step)
- Analytics integration (Google Analytics / Plausible)
- Search functionality across links
- Admin panel for content management
- Automated link validation
- RSS feed generation
Last Updated: December 27, 2024 Version: 1.0 (Production)