{"id":34717838,"url":"https://github.com/ozgurg/vergihesaplayici.com","last_synced_at":"2026-01-16T09:19:12.238Z","repository":{"id":38377932,"uuid":"264739938","full_name":"ozgurg/vergihesaplayici.com","owner":"ozgurg","description":"vergihesaplayici.com, calculates taxes.","archived":false,"fork":false,"pushed_at":"2026-01-14T03:52:24.000Z","size":75690,"stargazers_count":67,"open_issues_count":4,"forks_count":6,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-14T07:29:33.979Z","etag":null,"topics":["acikkaynak","astrojs","built-in-public","firebase","tax-calculator","vue","website"],"latest_commit_sha":null,"homepage":"https://vergihesaplayici.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ozgurg.png","metadata":{"files":{"readme":".github/README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-05-17T19:20:22.000Z","updated_at":"2026-01-14T03:52:04.000Z","dependencies_parsed_at":"2023-02-15T16:00:56.790Z","dependency_job_id":"bb9c7241-feaa-451f-8fa5-816ef49b8b8b","html_url":"https://github.com/ozgurg/vergihesaplayici.com","commit_stats":null,"previous_names":[],"tags_count":271,"template":false,"template_full_name":null,"purl":"pkg:github/ozgurg/vergihesaplayici.com","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozgurg%2Fvergihesaplayici.com","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozgurg%2Fvergihesaplayici.com/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozgurg%2Fvergihesaplayici.com/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozgurg%2Fvergihesaplayici.com/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ozgurg","download_url":"https://codeload.github.com/ozgurg/vergihesaplayici.com/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozgurg%2Fvergihesaplayici.com/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28478049,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T06:30:42.265Z","status":"ssl_error","status_checked_at":"2026-01-16T06:30:16.248Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["acikkaynak","astrojs","built-in-public","firebase","tax-calculator","vue","website"],"created_at":"2025-12-25T01:15:52.937Z","updated_at":"2026-01-16T09:19:12.232Z","avatar_url":"https://github.com/ozgurg.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Actions Status](https://github.com/ozgurg/vergihesaplayici.com/actions/workflows/main.yml/badge.svg)](https://github.com/ozgurg/vergihesaplayici.com/actions)\n![Version](https://img.shields.io/github/package-json/v/ozgurg/vergihesaplayici.com)\n\n[![Banner](https://raw.githubusercontent.com/ozgurg/vergihesaplayici.com/main/.github/banner.png)](https://vergihesaplayici.com)\n\n# vergihesaplayici.com\n\nvergihesaplayici.com, calculates taxes.\n\n---\n\n## Overview\n\n### Astro + Vue\n\n* Astro is a static site generator, and a static site is perfect for this \"static\" site. :)\n* Moving from Nuxt 2 to Nuxt 3 was painful.\n* I love using Vue, and I picked Vue for most parts of the code unless I needed special Astro features like `\u003cImage /\u003e`.\n\n### Domain Design\n\nEach page is organized by domain under `src/domains`. All utils, types, and other related files for a page live inside\nits own folder. This helps separate pages semantically.\n\n### `PageDef`\n\nInside `src/domains`, functions that end with `PageDef` define each page. They return a fixed output to avoid broken\nlinks. Yes, it makes the code a little bit verbose, but it's OK.\n\n### Color Extraction for Thumbs\n\n\"Telefon Vergisi Hesaplayıcı\" and \"Konsol Vergisi Hesaplayıcı\" have presets with thumbs. Each thumb shows a colored card\nwith its dominant color. To automate this, I created an Astro integration called `extract-color-from-thumbs`. It loads\nthe thumbs, extracts the main color using the `fast-average-color-node` library, and saves the result in a `.generated`\nfolder.\n\nAt first, I tried doing this in the browser, and it worked. But since Astro builds run in Node, the color extraction\nlibraries didn't work properly there. I also found some libraries that worked in Node but not in the browser. So, the\nfinal solution is a bit hacky, but it works for now.\n\n### Presets\n\n\"Telefon Vergisi Hesaplayıcı\" and \"Konsol Vergisi Hesaplayıcı\" have presets. Every day, a new phone is announced.\nCurrently, I'm only adding flagship phones from Apple and Samsung. Apple is the main focus because, according to site\nanalytics, none of this site's users really care about Samsung. I'll only add Samsung phones if I need to or if they\nvoluntarily pay me to do it. 💀\n\nAlso, the presets include prices that are manually updated. So, don't expect precision. These calculations only provide\ninformation about taxes.\n\n### SVG Cache\n\nI tested a new approach for managing SVGs by grouping them all inside one `\u003csvg /\u003e` as `\u003csymbol /\u003e` elements and\nreferencing them with `\u003cuse /\u003e`. This prevents repeating SVG code and helps reduce the HTML size. (But if an SVG is only\nused once, this actually increases the HTML size)\n\nI built a simple Map cache in `svg-cache.ts` to store SVGs, make symbols, and add them to the end of `\u003cbody /\u003e`. It\nworks in theory, but with Vue components using `client:load` on many pages, the cache breaks. So I commented this part\nout for now until I find a better way.\n\n### Exchange Rates\n\nI prefer free exchange rate services that do not require an API key. Free APIs are not precise, but since the calculator\non this site is not financially critical, precision is not that important. Exchange rates are fetched during the build\nprocess.\n\n### Tests\n\nTests in the `__test__` folder follow the directory structure. I wrote as many tests as I could, but for big and complex\nfiles, I marked them as TODO, though I probably won't write tests for them.\n\n### UI and CSS\n\nI made my own UI library based on my design ideas. Sometimes I reinvented the wheel just for fun. When building\ncomponents:\n\n* CSS properties must be well organized.\n* Always use `rem` units.\n* All CSS variables and SASS mixins start with the `vh` prefix.\n* Components should be as accessible as possible.\n* Components should behave and look like native HTML elements.\n* Since this is a little project, I don't use design tokens for components. Components use global CSS variables instead\n  of variables defined specifically for them.\n* I love trying new web features, but only if there's a good polyfill, and they\n  are [Baseline Widely-available](https://developer.mozilla.org/en-US/docs/Glossary/Baseline/Compatibility).\n\n### Articles\n\nThere are many AI-generated articles in the `src/content` folder. They look like SEO posts, but I first put them there\njust to show ad publishers the site wasn't empty. (They still haven't approved this site) Later, these articles started\ngetting visitors from search engines, so now they actually help with SEO a little. I don't like it.\n\n---\n\n## Contributing\n\nSee [CONTRIBUTING.md](https://github.com/ozgurg/vergihesaplayici.com/blob/main/.github/CONTRIBUTING.md)\n\n---\n\n## License\n\nThis project is licensed under the GNU Affero General Public License v3 (AGPLv3), with additional conditions under\nSection 7.\n\n### Summary of License Terms\n\n- You may use, modify, and redistribute this software under AGPLv3.\n- You **must preserve attribution** to the original author (\"Özgür Görgülü\") and project name (\"Vergi Hesaplayıcı\").\n- You **must not** reuse the project name (\"Vergi Hesaplayıcı\"), domain (\"vergihesaplayici.com), or any original\n  branding in derivative works unless granted permission.\n- You must **display attribution** in the user interface of any derivative version.\n\n[![License](https://img.shields.io/badge/License-AGPLv3-%2388DF95.svg)](https://github.com/ozgurg/vergihesaplayici.com/blob/main/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fozgurg%2Fvergihesaplayici.com","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fozgurg%2Fvergihesaplayici.com","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fozgurg%2Fvergihesaplayici.com/lists"}