Available now . Hours: Monday to Saturday, 9 to 6 Eastern

Ryan Rutan

I'm a front-end developer who builds marketing websites: landing pages, partner microsites, and, as part of the web team at TD SYNNEX NYSE: SNX, the customer-facing WordPress site a million people visit every year.

A career across marketing, product and code.

  • Tampa Bay, FL
  • Eastern time local
  • Monday to Saturday, 9 to 6
  • HTML
  • CSS
  • JavaScript
  • React
  • WordPress
  • Bootstrap
  • jQuery
Ryan Rutan and his family, seated in front of a Tangled-themed backdrop at Disney Add images/headshot.jpg
  • 14+ years building websites, the last ten as my day job
  • 1M+ visitors a year on the TD SYNNEX site I help maintain
  • Hundreds of landing pages across WordPress, AEM, Ceros and Sitefinity
  • 10+ Addy award-winning team projects

Work

Three of the sites I've built. Many more are live under the TD SYNNEX name, and some were for private clients, so I can't show them here. Pick one: it's the real site running inside the frame, so you can scroll and click around.

Lenovo Legends Program

Built at

A multi-page microsite for the Lenovo Legends partner program, with a space theme that runs from the hero to the contact form. It gives partners one place to find the program's blog, resources, trainings and events, and to get in touch.

Visit the live site (opens in a new tab)

What's inside
A space-themed hero, a blog hub, resources, trainings, events and a contact form.
Built with
HTML, CSS, JavaScript and Bootstrap, with the imagery prepared in Photoshop. Hosted on TD SYNNEX's content CDN.
My role
I built the site from the design mockups and prepared the imagery in Photoshop.

Side projects

Things I've built outside the day job.

Automated trading

Bitcoin futures trading bot

A TradingView strategy sends the signals. A small Python service turns them into Coinbase futures orders.

A TradingView strategy I wrote in Pine Script watches 12-hour Bitcoin candles and fires a BUY when the close crosses above the open, or a SELL when it crosses below. Each signal hits a Flask endpoint as a webhook. The Python side checks the shared secret, ignores duplicates, looks at the position that's already open, and places a two-contract BTC futures order through Coinbase's Advanced Trade API: long on BUY, short on SELL.

I kept the two halves apart on purpose. The strategy never sees contract sizes, leverage or credentials, so I can change the trading rules or the order logic without touching the other.

  • Python
  • Flask
  • Pine Script
  • TradingView webhooks
  • Coinbase Advanced Trade
  • REST APIs
  • BTC futures

How a signal becomes a trade

  1. TradingViewPine Script strategy fires on a 12-hour close
  2. WebhookPosts BUY or SELL with a shared secret
  3. FlaskValidates the JSON and the secret, normalizes the signal
  4. Position checkFlat, same side or opposite side decide what happens next
  5. CoinbaseTwo-contract BTC futures order, response logged
The webhook handler. From webhook_example.py. Secrets come from environment variables; a dry-run flag logs the order instead of sending it.
@app.route("/webhook", methods=["POST"])
def tradingview_webhook():
    if not request.is_json:
        return jsonify({"success": False, "error": "Request must contain JSON."}), 400

    data = request.get_json()
    if data.get("secret") != WEBHOOK_SECRET:
        logging.warning("Rejected webhook with invalid secret.")
        return jsonify({"success": False, "error": "Unauthorized."}), 401

    signal = (data.get("signal") or "").upper()
    if signal not in ["BUY", "SELL"]:
        return jsonify({"success": False, "error": "Signal must be BUY or SELL."}), 400

    try:
        # BUY -> long, SELL -> short, 2 contracts
        result = execute_futures_order(signal)
        return jsonify({"success": True, "signal": signal, "result": result}), 200
    except Exception as error:
        logging.exception("Trading execution failed.")
        return jsonify({"success": False, "error": str(error)}), 500
Example payload
{"secret": "…", "signal": "BUY"}
Safeguards
Webhook-secret validation, duplicate-signal protection, current-position check before every order, dry-run mode, and every exchange response logged.
Status
Signals and the Flask service work end to end in dry-run. Live Coinbase execution is the next step, once the futures product IDs and order fields are verified against the current API.

Chrome extension, live on the Web Store

Runs the numbers on any Zillow or Realtor.com listing, right on the page, in under a second.

Analyzing one rental by hand takes me 15 to 20 minutes across three tabs and a spreadsheet, and most listings don't work out anyway. Undrly puts the whole analysis on the listing page: monthly cash flow after every cost, cap rate, cash-on-cash return, break-even rent, a rent estimate from nearby rental listings, the seller's position, risk flags, and a verdict that says PASS when a deal loses money. Every input can be changed and the numbers update as you type.

I built and launched it on my own in August 2026: the product, the code, the design, payments, legal pages and the ads. The hard part was getting reliable numbers out of listing pages that change without warning. The licensing backend is a single Cloudflare Worker.

  • JavaScript, Manifest V3
  • Chrome extension
  • Cloudflare Workers + KV
  • Cloudflare Pages
  • Stripe
  • Zillow and Realtor.com
  • AirROI and FRED APIs

How a listing gets analyzed

  1. Listing loadsContent script wakes on Zillow or Realtor.com
  2. ExtractEmbedded JSON first, DOM parsing as fallback, every field tagged verified or estimated
  3. UnderwriteAll the math runs in the browser; nothing about the page leaves it
  4. RenderPanel with verdict, rent ladder and seller position, in under a second
  5. ProLive Airbnb market data for the exact address, metered through a Cloudflare Worker
The bug that cost me two builds. Zillow and Realtor.com don't refresh their embedded JSON when you click from one listing to the next, so the new page can still be holding the old listing's data. This fetches a fresh copy in the background.
// Next.js never rewrites __NEXT_DATA__ on client-side navigation, so
// listing B can load holding listing A's JSON. Fetch this page's own HTML
// in the background and parse a fresh copy; the DOM fallback only runs
// if the fetch genuinely fails.
function ensureRealtorNextDataFetch() {
  const href = window.location.href;
  if (realtorFetchedND.href !== href) {
    realtorFetchedND.href = href;
    realtorFetchedND.state = 'idle';
    realtorFetchedND.json = null;
  }
  if (realtorFetchedND.state !== 'idle') return;
  realtorFetchedND.state = 'pending';
  fetch(href, { credentials: 'same-origin' })
    .then((r) => (r.ok ? r.text() : Promise.reject(new Error('HTTP ' + r.status))))
    .then((html) => {
      if (realtorFetchedND.href !== href) return; // navigated away meanwhile
      const tag = html.indexOf('id="__NEXT_DATA__"');
      if (tag < 0) throw new Error('no __NEXT_DATA__ in fetched HTML');
      const open = html.indexOf('>', tag);
      const close = html.indexOf('</script>', open);
      realtorFetchedND.json = JSON.parse(html.slice(open + 1, close));
      realtorFetchedND.state = 'done';
    })
    .catch(() => {
      if (realtorFetchedND.href === href) realtorFetchedND.state = 'failed';
    });
}
Under the hood
No dependencies; the extension is all my own code. One Cloudflare Worker on KV handles license keys, metered lookups with a monthly spend cap, and the Stripe webhooks that create and revoke keys. An ops dashboard with server-rendered charts runs on the same Worker.
Privacy and pricing
No analytics, and no browsing data leaves the browser. Long-term rental analysis is free; Pro, which adds short-term rental mode, is $14.99 a month or $149.99 a year.

Experience

I've been building websites since 2012, on the side at first and as my day job since 2016. Eleven years at Tech Data and TD SYNNEX, plus a year running my own web business.

  1. to now

    Front End Web Developer Now

    , remote

    • Part of the web team that maintains TD SYNNEX's main customer-facing WordPress site for the Americas, which gets more than a million visitors a year.
    • Turn wireframes into responsive sites, including hundreds of landing pages across WordPress, Adobe Experience Manager, Ceros and Sitefinity.
    • Built an internal ticket-submission system in React and Firebase, and mentor new people on the team.
  2. to

    Founder

    • Ran a subscription web service for small businesses, from the first build to ongoing support.
    • Custom WordPress builds in PHP, JavaScript and CSS, with SEO, lead funnels, GA4 and CRM integrations.
    • Handled hosting on Flywheel, DNS, and all client and operations management.
  3. to

    Digital Marketing Specialist II (Web)

    • Built for the web in Sitefinity CMS.
    • Ran web ads in AdButler and A/B tested them.
    • Was the team's expert on Brainshark LMS and SharePoint, and led the associate specialists.
  4. to

    Product Manager (HPE)

    , then Tech Data

    • Ran cross-functional campaigns for seven-figure initiatives.
    • Helped plan the roadmap, tracked KPIs and supported budget planning.
  5. BA, Business Administration and Management

    St. Petersburg College

  6. Started building websites

    On the side, four years before it became the day job

Toolkit

My laptop lid, more or less: every tool I work with, as a sticker. Throw them around, or pull together the set I used on one project.

By project
By type
The pile
  • HTML
  • CSS
  • JavaScript
  • jQuery
  • Visual Composer
  • Marketing automation
  • Smartsheet

The stickers with a green dot have a note on where I used them. Tap one, or pick a project to see what it was built with.

How a website works

Every site is seven layers, built from the ground up. This stack is the top of this page, pulled apart.

Tour
Pick a layer

Pick a layer to lay it flat, or press Build it to stack all seven.

  1. A domain, a server, https and fonts from a CDN.

    For youDomain, hosting, SSL, updates and backups, handled every month.

  2. HTML: a header, headings, lists, buttons and a figure.

    For youHand-written, accessible markup that Google reads easily.

  3. CSS: two typefaces, the teal, hairlines and a grid that reflows.

    For youYour brand, looking right on every screen.

  4. The name, the lead, the facts line and the stats.

    For youA CMS you can update yourself, in minutes.

  5. The family photo, the tool stickers and the favicon.

    For youImages compressed to look sharp and load fast.

  6. JavaScript: the status pill, the clock and the editor that types.

    For youMenus, forms and custom features, kept light and fast.

  7. Search tags, the Email me button and the contact form.

    For youAnalytics, search basics and lead forms, so every inquiry reaches you.

Need a developer? I can help.

I've helped small businesses get online, and I still take a few on. Website, email, ads and the advice in between, from one person who handles all of it.

  • A website that fits the business

    WordPress, with a theme chosen and customized for you, or custom features built for the way you work. Fast on every screen.

  • Email, domain and security

    Business email that lands in the inbox, DNS that points where it should, SSL and the security settings done right.

  • Hosting, updates and backups

    Managed hosting, WordPress and plugin updates applied and checked, and daily backups.

  • Facebook ads and lead funnels

    Campaigns built around a landing page designed to convert, so the ad spend brings in calls and form fills.

  • SEO and analytics

    Search Console, GA4 and the on-page basics done right, so people find you on Google and you can see what's working.

  • Straight advice

    Ask me anything about running a business online. If you need something I don't do, like a detailed custom logo, I'll say so and point you to someone good.

yourbusiness.com, a typical month

  • siteonline, SSL valid, backups running
  • updatesWordPress core and plugins, checked after
  • emaildelivering; SPF, DKIM and DMARC in place
  • adscampaign live, landing page tuned
  • seoSearch Console clean, GA4 reporting
  • yourunning the business
The monthly status report you get from me.

How it starts

  1. TalkA conversation about what the business needs
  2. PlanA short plan with one monthly price
  3. BuildSite, email, ads and analytics set up and launched
  4. RunUpdates, backups and tweaks every month

A good fit if

  • You have 1 to 10 people and nobody whose job is the website.
  • You want the site to bring in customers.
  • You'd rather have one person who knows your whole setup than a different vendor for each piece.

Probably not if

  • You need a full brand identity or a detailed custom logo first. I'll point you to someone good for that.
  • You're after a large custom web app with a team behind it.

Off the clock

When I'm not working I'm hosting guests, at the gym, at Disney, or playing RollerCoaster Tycoon.

The house I host in Tarpon Springs, lit up at dusk Real estate Airbnb Superhost, 4.89 from 35 reviews A remodeled home in Tarpon Springs I host: six guests, three bedrooms, two kayaks and a nature park across the street. I invest in real estate too. (opens Airbnb in a new tab) Real estate Undrly, a Chrome extension I built it to run the numbers on rental listings on Zillow and Realtor.com: cash flow, cap rate and cash-on-cash in seconds. The full write-up is under Side projects. (opens the Chrome Web Store in a new tab)
Outside the Magic Kingdom train station at Halloween, in front of a giant lit jack-o'-lantern For fun Disney We're annual passholders and go a lot.
Dixie, a brindle dog, looking straight at the camera At home Dixie Supervises all remote work from the couch.
Tilly, a chocolate lab, with her head tilted At home Tilly Head tilt on request.
For fun Lifting Five days a week, for 18 years.
For fun Call of Duty The one game I keep coming back to.
For fun RollerCoaster Tycoon Still my favorite game.
Side gig Merch by Amazon Print-on-demand designs, sold through Amazon.
Side gig Online stores I've run stores on Shopify, Etsy and Amazon. See my Etsy shop (opens in a new tab)

Let's talk

Email ryan@ryanwrutan.com, message me on LinkedIn (opens in a new tab), or use the form. My code is on GitHub (opens in a new tab). I'm around Monday to Saturday, 9 to 6 Eastern.

Read my resume (opens in a new tab) (PDF, 2 pages), and download it from there if you'd like a copy.

Opens in your mail app with this filled in, so you can add anything else before it goes.