/* global React */
/* Content data for the portfolio: work, side projects, blog posts, about, rates. */

const WORK = [
  {
    id: 'thirdface',
    name: 'thirdface',
    role: 'Founding Engineer',
    when: 'Oct 2025 — Present',
    where: 'Berlin, Germany',
    summary: 'Consumer + AI + hardware. Founding engineer; building the product surface and the infra under it. The first device ships this year.',
    bullets: [
      'Owning the full client → cloud → device path. One brain, many hats.',
      'Trading architecture for velocity on purpose; paying the debt down before it compounds.',
      'Made the call to ship the demo on a single Postgres instead of waiting on the planned event bus. Saved three weeks.',
    ],
    stats: ['47s first-pair', '1 founding eng', '0 → 1'],
  },
  {
    id: 'conversion',
    name: 'Conversion AI',
    role: 'Senior Full-Stack',
    when: 'Sep 2024 — Oct 2025',
    where: 'San Francisco Bay Area',
    summary: 'Frontend lead on Seona (AI SEO assistant) and Levi (AI website builder). SMBs everywhere, edge cases also everywhere.',
    bullets: [
      'Cut Levi\'s editor TTI by ~40% via streaming + smarter Suspense boundaries.',
      'Owned the design-system rewrite that retired ~22 one-off button components.',
      'Wrote the testing playbook the rest of frontend now uses.',
    ],
    stats: ['−40% TTI', '−22 buttons', 'React / Next'],
  },
  {
    id: 'realest',
    name: 'The Realest',
    role: 'Senior Full-Stack',
    when: 'Dec 2023 — Aug 2024',
    where: 'Los Angeles',
    summary: 'Memorabilia auction marketplace. TypeScript + AWS. Bidding under load is harder than it looks.',
    bullets: [
      'Pioneered launch of the bidding/checkout path. SHA-256 audit trail.',
      'Component refactor: −30% codebase, +reusability across surfaces.',
      'Stress-tested checkout to 8× the launch peak. It held.',
    ],
    stats: ['−30% LOC', '8× launch peak', 'TS / AWS'],
  },
  {
    id: 'bpm',
    name: 'BPM Music',
    role: 'Lead Full-Stack',
    when: 'Oct 2022 — Dec 2023',
    where: 'Los Angeles',
    summary: '4+ enterprise web apps for a global DJ-pool. Next.js with SSR / ISR; storage cost negotiation and all.',
    bullets: [
      '−40% page load via SSR + smarter caching.',
      'Killed three custom admin tools in favor of one shared one nobody complained about.',
      'On-call rotation lead. Quietly fixed the alerting noise.',
    ],
    stats: ['−40% TTFB', 'Next.js', 'Lead'],
  },
  {
    id: 'soshme',
    name: 'Söshme',
    role: 'Co-founder & CEO',
    when: 'Feb 2019 — Feb 2022',
    where: 'San Francisco',
    summary: 'Banking platform for creators between brands, agencies, and audience. Wound down honestly when the unit economics stopped working. Learned more than at any job since.',
    bullets: [
      'AES-256 on every API call. Tax automation in-app.',
      'Raised, hired, shipped, eventually closed it cleanly. Ask me about it.',
      'Three years of "founder" written on the same line as "engineer".',
    ],
    stats: ['3 yrs', 'AES-256', 'wound down'],
  },
  {
    id: 'portal',
    name: 'Portal Entryways',
    role: 'iOS Lead / PM',
    when: 'Aug — Dec 2019',
    where: 'San Francisco',
    summary: 'Hands-free Bluetooth doors for accessibility. Led 4 iOS engineers. The metric that mattered: doors actually opened.',
    bullets: [
      'Live on the App Store with 346 daily actives at peak.',
      '19,000 doors opened for users who needed them open.',
      'Maps, support chat, and accessibility all shipped in 5 months.',
    ],
    stats: ['346 DAU', '19K doors', 'Swift / Bluetooth'],
  },
];

const SIDE = [
  {
    id: 'tft',
    name: 'TFT Graph',
    when: '2019',
    summary: 'Team-fight-tactics composition optimizer using a graph ADT and the public LoL API. Picks your "must have" teammate and items from the first champion you choose.',
    bullets: ['Python + Flask', 'Pulls live data from the official API', 'Mostly an excuse to write a graph library'],
  },
  {
    id: 'ow',
    name: 'Overwatch API',
    when: '2019',
    summary: 'There was no official Overwatch API and the unofficial ones were missing things. So: documented Node.js routes for player and game data.',
    bullets: ['Node.js', 'RESTful, documented', 'Shipped in a month'],
  },
  {
    id: 'alieny',
    name: 'Alieny Escape',
    when: '2016 — 2019',
    summary: 'iOS puzzle/strategy game scoring users on speed, accuracy, problem solving. Built in two months at Make School Summer Academy 2017.',
    bullets: ['2,700+ downloads', 'Best iOS Game — Make School \'17', 'SpriteKit + Swift'],
  },
  {
    id: 'investlog',
    name: 'InvestLog',
    when: 'ongoing',
    summary: 'Personal finance tracker for people who think in spreadsheets but want a real app. Subject of one of the essays.',
    bullets: ['React Native', 'Local-first', 'Still using it daily'],
  },
  {
    id: 'rec',
    name: 'Real Estate Calculator',
    when: '2019',
    summary: 'Track properties, compute cash flow, keep the data secure. Swift + Firebase, tiny scope, finished it in a month.',
    bullets: ['Swift / Xcode', 'Firebase', 'Shipped in 30 days'],
  },
  {
    id: 'commitping',
    name: 'CommitPing',
    when: '2019',
    summary: 'Pings a Slack channel on every commit to selected GitHub repos. Go + Slack API, on a small server.',
    bullets: ['Golang', 'Slack API', 'Tiny, useful, still up'],
  },
];

const POSTS = [
  {
    id: 'cache',
    title: 'Cache me outside',
    date: '2026-02-14',
    size: '7K',
    kind: 'Essay',
    read: '6 min',
    body: [
      'Cache invalidation is one of the two hard problems. The other is the half of your team who think they understand it.',
      'A short, opinionated tour through the cache layers I actually reach for: the browser, the CDN, the application, the database, the human brain. Each one with a sharper failure mode than the last.',
      'The trick isn\'t fewer caches. It\'s knowing which cache lied to you first.',
    ],
  },
  {
    id: 'on',
    title: 'What is O(n)?',
    date: '2025-11-02',
    size: '4K',
    kind: 'Essay',
    read: '4 min',
    body: [
      'A note for the people who quietly nodded through their first algorithms class and never quite admitted they were lost. You are not alone. You are also not in trouble.',
      'Big-O is a vocabulary, not a religion. It tells you the shape of how slow your code gets when the input grows. It does not tell you whether your code is fast.',
      'Read the loops. Count the work. Argue with whoever wrote the comment that says "fast".',
    ],
  },
  {
    id: 'undocumented',
    title: 'Undocumented.',
    date: '2025-08-19',
    size: '12K',
    kind: 'Essay',
    read: '9 min',
    body: [
      'I spent a week reformatting code I wrote five years ago. It was, by every reasonable measure, a waste of time. By every other measure, it was the most useful week of the quarter.',
      'There\'s a particular grief in reading your old code. It is more honest than your résumé.',
      'On the value of going back, of leaving notes for the next maintainer (almost always you), and on why "undocumented" is a verb in this house.',
    ],
  },
  {
    id: 'investlog-essay',
    title: 'InvestLog: Taking back full control of your personal finances',
    date: '2025-04-08',
    size: '9K',
    kind: 'Essay',
    read: '7 min',
    body: [
      'I built InvestLog because every personal-finance app makes the same trade: convenience for opinion. They tell you what to feel about your money.',
      'I want to see the numbers and decide for myself.',
      'The architecture, the privacy stance (local-first), and the spreadsheet I had to admit was always going to be there.',
    ],
  },
  {
    id: 'founding-eng',
    title: 'The first engineer you want on the team',
    date: '2026-04-01',
    size: '5K',
    kind: 'Essay',
    read: '5 min',
    body: [
      'A founding engineer is a frame, not a title. You are paid to do the right thing for now and to know when "now" has stopped.',
      'The job is half infra, half product, half taste. (Yes.) You ship things you know you will rewrite. You leave receipts.',
      'A short defense of the role and the people who keep getting drafted into it.',
    ],
  },
  {
    id: 'wound-down',
    title: 'How to wind down a company without lying',
    date: '2025-01-22',
    size: '8K',
    kind: 'Essay',
    read: '6 min',
    body: [
      'Söshme didn\'t fail dramatically. It failed quietly, the way most things do. The unit economics stopped working and we admitted it.',
      'A note on what to tell your investors, your team, your customers, and yourself — in that order, and without rounding.',
      'There is a respectable way to end a thing. Most people don\'t take it.',
    ],
  },
];

const RATES = [
  { who: 'Project',   price: '$28K',  unit: '/ engagement', desc: 'Defined scope, fixed window. We agree on the outcome before we agree on the bill.' },
  { who: 'Founding',  price: '$40K',  unit: '/ month',      desc: 'Full-time, embedded, code commits and product calls. Two-month minimum, three-week notice either way.' },
  { who: 'Advisory',  price: '$4K',   unit: '/ month',      desc: 'Two calls a month, async access, occasional architecture review. For founders who already have a team.' },
];

const ABOUT = {
  hello: 'Hi, I\'m Timofey.',
  blurb: [
    'I\'ve spent ten-plus years being the first engineer on something. Sometimes literally — Söshme, thirdface — sometimes effectively, where the brief was "make it real before Monday".',
    'My DNA is founding-engineer; my brain is wired for infra. I will trade architecture for velocity on purpose, and then pay the debt down before it compounds. I treat my reader, my PM, and my future self as peers.',
    'Right now I\'m at thirdface in Berlin, building consumer hardware with AI underneath it. I freelance and consult on the side when the work is honest and the team is small.',
  ],
  facts: [
    'Berlin / San Francisco',
    'EN · RU · IT',
    '10+ years',
    'iOS, web, infra, the seam between',
    'Booking Q3 2026 · 1 slot left',
  ],
};

Object.assign(window, { WORK, SIDE, POSTS, RATES, ABOUT });
