{"id":13630188,"url":"https://github.com/piratepx/app","last_synced_at":"2025-04-17T13:31:42.671Z","repository":{"id":48711305,"uuid":"296591281","full_name":"piratepx/app","owner":"piratepx","description":"Just a little analytics insight for your personal or indie project","archived":false,"fork":false,"pushed_at":"2024-09-25T00:55:54.000Z","size":869,"stargazers_count":71,"open_issues_count":0,"forks_count":4,"subscribers_count":4,"default_branch":"development","last_synced_at":"2024-11-08T21:38:30.699Z","etag":null,"topics":["analytics","counter","google-analytics","insight","metrics","no-cookies","no-javascript","privacy","stats","website-analytics"],"latest_commit_sha":null,"homepage":"https://www.piratepx.com","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/piratepx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-09-18T10:38:40.000Z","updated_at":"2024-10-09T12:52:47.000Z","dependencies_parsed_at":"2024-11-08T21:31:33.955Z","dependency_job_id":"d193a5f5-e505-43af-b8a2-1b67a341c3b2","html_url":"https://github.com/piratepx/app","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piratepx%2Fapp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piratepx%2Fapp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piratepx%2Fapp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piratepx%2Fapp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piratepx","download_url":"https://codeload.github.com/piratepx/app/tar.gz/refs/heads/development","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249344814,"owners_count":21254742,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["analytics","counter","google-analytics","insight","metrics","no-cookies","no-javascript","privacy","stats","website-analytics"],"created_at":"2024-08-01T22:01:33.043Z","updated_at":"2025-04-17T13:31:42.657Z","avatar_url":"https://github.com/piratepx.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# 🏴‍☠️ piratepx\n\nA simple, privacy-respecting, no cookie, zero JavaScript, 35 byte counter pixel\nfor websites, mobile apps, server-side APIs, CLIs, and just about anywhere else.\n\nSign up for free at https://www.piratepx.com!\n![piratepx](https://app.piratepx.com/ship?p=54c04676-e9cf-4ca8-8934-78a629eb4a2c\u0026i=app)\n\n## Overview\n\nThis repository contains both the backend and frontend of the app to simplify\ndevelopment and deployment. Other than a few lines of configuration here and\nthere to make this possible, however, they're pretty much separate codebases.\n\n### Backend\n\nThe backend is a JSON REST API built in [Node.js](https://nodejs.org/) using\n[Fastify](https://www.fastify.dev/) and\n[Objection.js](https://vincit.github.io/objection.js/). It persists data to a\n[PostgreSQL](https://www.postgresql.org/) database.\n\nThe source code is located in the [`api`](api) directory, with configuration\nfiles in the root of this repository (where this README lives).\n\n### Frontend\n\nThe frontend is a single-page app built with [Vue.js](https://vuejs.org/) and\n[Tailwind CSS](https://tailwindcss.com/).\n\nThe source code is fully isolated in the [`web`](web) directory, which is also\nwhere its own configuration files are located.\n\n## Development\n\nThe following includes the necessary steps to get the full app setup for\ndevelopment, with a focus on backend-specific details. See\n[`web/README.md`](web/README.md) for frontend-specific details.\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org/) (see `engines.node` in\n  [`package.json`](package.json))\n- [PostgreSQL](https://www.postgresql.org/) \u003e= v16\n\n[Docker Compose](https://docs.docker.com/compose/) is used to run PostgreSQL as\nconfigured in [`compose.yaml`](compose.yaml). Once installed, simply run:\n\n```bash\n$ docker compose up\n```\n\nThe app itself is not run in a Docker container in development, as it's easy\nenough to install the necessary version of Node.js with\n[nvm](https://github.com/nvm-sh/nvm):\n\n```bash\n$ nvm install\n```\n\n### Dependencies\n\nInstall dependencies with npm:\n\n```bash\n$ npm install\n$ cd web \u0026\u0026 npm install\n```\n\n### Config\n\n[dotenv](https://github.com/motdotla/dotenv) is used to load environment\nvariables from a `.env` file into `process.env`. This file is ignored by version\ncontrol to prevent committing secrets.\n\nSee [`.env.dist`](.env.dist) for an example.\n\n### Database\n\n#### Migrations\n\n[Knex.js](https://knexjs.org/guide/migrations.html) is used to manage database\nmigrations, which are located in [`api/db/migrations`](api/db/migrations).\n\nTo run the latest migrations:\n\n```bash\n$ npm run knex migrate:latest\n```\n\n### Start\n\nStart both the backend and frontend development servers:\n\n```bash\n$ npm run dev\n```\n\n### Code Style \u0026 Linting\n\n[Prettier](https://prettier.io/) is setup to enforce a consistent code style.\nIt's highly recommended to\n[add an integration to your editor](https://prettier.io/docs/en/editors.html)\nthat automatically formats on save.\n\n[ESLint](https://eslint.org/) is setup with the\n[\"recommended\" rules](https://eslint.org/docs/latest/rules/) to enforce a level\nof code quality. It's also highly recommended to\n[add an integration to your editor](https://eslint.org/docs/latest/use/integrations#editors)\nthat automatically formats on save.\n\nTo run via the command line:\n\n```bash\n$ npm run lint\n```\n\n## Releasing\n\nAfter development is done in the `development` branch and is ready for release,\nit should be merged into the `main` branch, where the latest release code lives.\n[Release It!](https://github.com/release-it/release-it) is then used to\ninteractively orchestrate the release process:\n\n```bash\n$ npm run release\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpiratepx%2Fapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpiratepx%2Fapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpiratepx%2Fapp/lists"}