# Taras Shynkarenko > Full text of every page on https://tarasshynkarenko.com. See https://tarasshynkarenko.com/llms.txt for the link index and > https://tarasshynkarenko.com/sitemap.md for every page as Markdown. # https://tarasshynkarenko.com/ # Taras Shynkarenko Staff Software Engineer I've been building web apps for about ten years: tiny startups, big products, everything in between. Right now I'm mostly working on these: ## Personal projects - [Flowsery](https://flowsery.com/): Analytics and AI session replay, tied to revenue. - [AdaptlyPost](https://adaptlypost.com/): Write once. Adapt instantly. Post everywhere. - [RedReplier](https://redreplier.com/): Reddit, X and HN buying signals, ranked by intent. - [ClawOneClick](https://clawoneclick.com/): Your AI assistant, live in seconds. ## Stack - Frontend: React, Next.js, TypeScript - Backend: Node.js, NestJS, GraphQL - Data: PostgreSQL, Prisma, Kafka, Redis - Infra: Docker, Kubernetes, Cloudflare, OpenTelemetry ## Contact - GitHub: https://github.com/tarasshyn - LinkedIn: https://www.linkedin.com/in/taras-shynkarenko/ - Email: contact@tarasshynkarenko.com # https://tarasshynkarenko.com/skills # Open-source AI agent skills All of these AI agent skills live in one public repo in the SKILL.md format, so they work with Claude Code, Codex, Cursor and any agent that reads skills. Install them all with one command, or copy a single SKILL.md from its page. Repository: https://github.com/TarasShyn/skills Install: `npx skills@latest add TarasShyn/skills` ## Skills - [Preferred on Google](https://tarasshynkarenko.com/skills/google-preferred-sources-button): Adds a "Make us preferred on Google" button to the footer and under every article. Framework agnostic. Source: https://github.com/TarasShyn/skills/tree/main/skills/google-preferred-sources-button # https://tarasshynkarenko.com/skills/google-preferred-sources-button # An agent skill that adds a Google preferred sources button to any site Drop this skill into your agent and it will wire a Google preferred sources button into the footer and under every article, using the code Google documents. Readers who click it see your site more often in Top Stories, AI Mode and AI Overviews. Repository: https://github.com/TarasShyn/skills/tree/main/skills/google-preferred-sources-button Install: `npx skills@latest add TarasShyn/skills --skill google-preferred-sources-button`, or copy this folder into your agent's skills directory. ## SKILL.md --- name: google-preferred-sources-button description: Add a "Make us preferred on Google" button to any website so readers can mark the site as a Google preferred source (shown with a "preferred" badge in Top Stories, AI Mode and AI Overviews). Language and framework agnostic - plain HTML, React, Vue, Svelte, Astro, PHP templates, anything that renders HTML. Use this whenever the user mentions preferred sources, "preferred on Google", the Google source preferences tool, the `publisher.js` / `swg` script, a "prefer us on Google" button, or wants readers to see their articles more often in Google Search. Also use it when adding a footer CTA or an end-of-article CTA for a blog and the site is a news, blog, or content publisher. --- # Google preferred sources button Google lets readers pick sites they want to see more of. When a reader marks your site as a preferred source, Google is more likely to show your articles in Top Stories with a "preferred" badge, and it can badge your content in AI Mode and AI Overviews for that reader. The mechanism is per reader, so the job of this skill is to get the ask in front of readers at the moments they are most likely to say yes, using code Google actually documents. Everything below comes from Google's official guide at https://developers.google.com/search/docs/appearance/preferred-sources (verbatim code and links are in `references/google-docs.md`). Do not claim ranking boosts, traffic numbers, or "SEO" effects that the doc does not state. What Google says: the site becomes "more likely to appear in Top Stories" for that reader, and gets a "preferred" badge in Top Stories, AI Mode and AI Overviews. ## Check eligibility first Only domains and subdomains are eligible. `https://www.example.com/` and `https://blog.example.com/` can be preferred sources. `https://www.example.com/blog` cannot, because the preference applies to the whole host. Before writing code: 1. Open `https://www.google.com/preferences/source?q=` and confirm the site shows up in the search box results. If it does not appear, the button will open a dialog with nothing to add. Tell the user and stop. 2. Note which host the reader will actually prefer. A blog on `blog.example.com` makes `blog.example.com` the preferred source, not the marketing site. A blog under `example.com/blog` makes all of `example.com` the preferred source. Say this out loud to the user so the wording matches reality. ## Pick an implementation Google ships three. Pick by what the site can run. | Site can run | Use | Why | | --- | --- | --- | | Client-side JavaScript, default look is fine | Standard button (two lines) | Google renders a localized, Google-styled button. Least code. | | Client-side JavaScript, you want your own button | Manual mode (`preferred-sources-control="manual"` + `PREFERRED_SOURCE` queue, or the ESM import) | Your design system, your label, same dialog flow. | | No JavaScript (email, CMS with no script access, social posts) | Deeplink `https://www.google.com/preferences/source?q=` | Plain link to the source preferences tool. | Most product sites want manual mode: the button should look like the rest of the footer, and the label should be in the site's translation files. ### Standard button ```html
``` `data-theme` is `light` (default) or `dark`. `data-lang` overrides the browser language; the supported codes are in Google's CSV (link in the references file). The script scans the DOM for `google-add-preferred-source-btn` on load, so in a client-rendered app make sure the element exists before the script runs, or use manual mode. ### Manual mode (your own button) Load the script once with the manual attribute, then push a callback onto the global queue. The callback runs when the library is ready, whether that is before or after your code executed. ```html ``` ESM variant, for bundlers and module scripts: ```js import { preferredSource } from 'https://news.google.com/swg/js/v1/publisher.mjs'; preferredSource.init({ theme: 'light', lang: 'en' }); button.onclick = () => preferredSource.addPreferredSource(); ``` Rules that make manual mode behave in a real app: - Load the script exactly once. Give the `