Skip to content

Instantly share code, notes, and snippets.

View ai's full-sized avatar
🚀

Andrey Sitnik ai

🚀
View GitHub Profile
@ai
ai / cloudflare-matomo-worker.js
Last active March 28, 2024 19:11
Cloudflare worker to send statistics to Matomo
async function trackVisit (request, visitorId) {
let data = {
token_auth: 'secret',
country: request.headers.get('CF-IPCountry'),
urlref: request.referrer || request.headers.get('Referer'),
idsite: 1,
lang: request.headers.get('Accept-Language'),
apiv: 1,
rand: Math.random().toString(16).slice(2),
url: request.url,
@ai
ai / requirements.md
Last active December 19, 2023 14:19
Website requirements

Amplifr logo

Amplifr Landings Rules

Amplifr’s rules for landing pages created by outsource.

Requirements

Принципы разработки Амплифера

Тут перечислены не законы, последние слово всегда за здравым смыслом. Тут перечислены лишь направление, куда надо стремиться. Принципы, которые должны помочь, когда не знаешь, что выбрать.

Ценности

  1. Пользователь. Если что-то сильно мешает UX или есть критическая ошибка, то в первую очередь мы спасаем пользователей. Для этого иногда надо взять ответственность на себя, переубедить толпу, написать плохой код.
name: Update target browsers
on:
schedule:
- cron: "0 2 1 * *"
permissions:
contents: write
pull-requests: write
jobs:
update-browserslist-database:
runs-on: ubuntu-latest
➜ npx autoprefixer --info
Browsers:
Chrome for Android: 94
Firefox for Android: 92
QQ Browser: 10.4
UC for Android: 12.12
Android: 94
Chrome: 94, 93, 92, 91
Edge: 94, 93, 92
Firefox: 93, 92, 91, 78
$ npx autoprefixer --info
Browsers:
  Chrome for Android: 90
  Firefox for Android: 87
  QQ Browser: 10.4
  UC for Android: 12.12
  Android: 90
  Chrome: 90, 89, 88, 87
  Edge: 90, 89, 88

New API for Nano Stores

We split all stores to 2 categories: store (for any store) and map (for key-value object and special helpers to work with keys).

Memory store is a regular store, which keep value in the memory (and do not clean it until page will be closed).

import { memoryStore } from 'nanostores'

let profileCache = memoryStore<Profile>(guestProfile)

Zero-knowledge Auth

The modern email/password authentication does not protect users from bad practices and, in the secure version (with 2FA), is difficult to use.

The IT world needs more discussion about authentication mechanisms to find more convenient and secure options.

This proposal contains an unusual authentication for a small subset of use cases. What problems does it have in terms of security and usability?

Task

Краткая характеристика:

  1. У него много сторов и сторы могут зависеть друг от друга, а не один большой стор и селекторы. То есть он ближе к Эфектору, чем в Редаксу/MobX. Всё ради tree shaking.
  2. Он ближе к стору прямых измений. В публичном API нет экшенов. Но всё-таки value = 1 на манер MobX запрещены — значения можно менять только через спец. методы. И в синхронизации состояния с сервером экшены есть (просто скрыты из публичного API).

Плюсы:

  1. Может работать без Логакса, чисто как стейт-менеджер.
  2. API специально создан, чтобы хранить в сторах бизнес-логику, чем разгружать компоненты и упрощать переносимость приложения между фреймворками.
  3. От 157 байт (!) в вашем JS-бандле.
  4. Расчитан на агрессивный tree shaking, чтобы в JS-бандле был только код того состояния, которые используются в текущих страницах.
  5. Очень ленивый — сторы на которых никто не подписан выгружаются из памяти, а их бизнес-логика останавливается.