- feat(redirect): optional click-id passthrough on web destinations (#30) (728d9cd), closes #30
- chore(sdk): genericize appToken comment (no private-product references) (#29) (af69880), closes #29
- fix(attribution): ignore shared/NAT IPs in fingerprint matching + support CDN client-IP header (#26) (58684e1), closes #26
- docs(sdk-spec): document optional appToken for Cloud install scoping (#25) (9bf399c), closes #25 #24
- feat(sdk): accept optional appToken on /api/sdk/v1/install (#24) (1e68a0b), closes #24 post-#75 LinkForty/cloud#76
- ci: drop unneeded npm@latest update step (4ccffbe)
- fix(redirect): browser-aware mobile fallback so regular browsers go to App Store (#23) (0c84eee), closes #23
- FIX: Adding engines to prevent installation unsupported nodejs versions (#14) (e6efcf6), closes #14
- fix: remove competitor pricing (1c2351b)
- fix: prioritize web fallback over app store URL in redirect handler (6345b99)
- Merge pull request #13 from fantaJinMode/qrcode_types_to_dev_dependencies (c6e803f), closes #13
- FIX: Adding @types/qqrcode to dev dependencies (8c15a05)
- Merge pull request #11 from fantaJinMode/jsdoc_comments_for_exported_func (c75ac54), closes #11
- FIX: JSDoc comments for exported function (ab76241)
- fix(ci): remove dist asset uploads from GitHub releases (99b669b)
- Clean up features from README (02141a0)
- Merge pull request #20 from RaoUsama7/fix/link-cache-invalidation (74febe4), closes #20
- Merge pull request #21 from RaoUsama7/fix/client-ip-followup (cdea12c), closes #21
- Update README.md (#19) (9b7dd91), closes #19
- fix(cache): invalidate link resolution cache on update and delete (151af71)
- fix(cache): invalidate link resolution cache on update and delete (7c2510a)
- feat: extend interstitial page to all mobile requests and preserve URL fragments (9b20190)
- fix: implement URL fallback chain in redirect handler to prevent 500 errors (#17) (3e3ee12), closes #17
- fix: correct repository URL casing for npm provenance verification (4e0487a)
- fix: update release workflow for npm trusted publishing with OIDC (b26ad63)
- fix: upgrade @semantic-release/npm to v13 for OIDC trusted publishing support (386048a)
- fix: upgrade semantic-release to v25 for OIDC trusted publishing (1050651)
1.13.4 (2026-03-16)
1.13.3 (2026-03-13)
1.13.2 (2026-03-10)
- restore .js extension in fingerprint.ts database import for ESM resolution (486cd65)
1.13.1 (2026-03-10)
- use vitest Mock type for db.query mock to fix CI type errors (86237e1)
1.13.0 (2026-03-10)
- add sdk_event webhook event type (3a2809f)
1.12.2 (2026-03-04)
- add revenue event convention to SDK event endpoint comment (5880109)
1.6.6 (2026-03-03)
1.6.5 (2026-03-02)
1.6.4 (2026-02-28)
- add Docker Hub overview with competitor positioning (48353b9)
- remove shields.io badge from Docker Hub overview (33c5f20)
1.6.3 (2026-02-27)
- optimize README for LLM discoverability and fix SDK listings (2804f7e)
1.6.2 (2026-02-27)
- add llms.txt for LLM-optimized integration reference (52c95dd)
1.6.1 (2026-02-25)
- add SDK feature specification for contributors (9272bb7)
All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
Automated releases are managed by semantic-release.
- Add link templates — New
link_templatestable and full CRUD API (GET/POST/PUT/DELETE /api/templates,PUT /api/templates/:id/set-default). Templates provide reusable default settings (platform URLs, UTM parameters, targeting rules, attribution windows) that are applied when creating links. Auto-generates unique 8-character alphanumeric slugs for template-based short URLs (/:templateSlug/:shortCode). - Add
templateIdto link creation — Links can now be assigned to a template via the optionaltemplateIdfield. Template slug is included in link query responses astemplate_slug. - Add
LinkTemplate,LinkTemplateSettings,CreateTemplateRequest,UpdateTemplateRequesttypes — New TypeScript interfaces for template management, exported from@linkforty/core/types.
- Rewrite README for v1.5.0 framework changes — Updated description to reflect framework-first philosophy, removed
userstable from schema docs, madeuserIdoptional in all API examples, added missing endpoints (webhooks, QR codes, SDK, debug, well-known, OG preview), added missing database tables (device_fingerprints, install_events, in_app_events, webhooks), fixed field names (iosAppStoreUrl/androidAppStoreUrl), fixed SDK package name to@linkforty/mobile-sdk-react-native
- Remove
userstable from Core — Core no longer creates or manages auserstable. Authentication and user management are now the consumer's responsibility, aligning Core with a framework-first philosophy (bring your own auth). Consumers that relied on Core'suserstable must create it themselves before any tables that referenceusers(id). - Make
user_idnullable onlinksandwebhookstables — Theuser_idcolumn on bothlinksandwebhooksis now nullable with no foreign key constraint. This enables single-tenant usage without a user model. - Remove
User,Organization,AppConfig, andOrganizationSettingstypes — These Cloud-only types have been removed from@linkforty/core/types. Consumers that imported them must define their own.
- Optional
userIdacross all API endpoints — All link, analytics, webhook, and debug endpoints now acceptuserIdas an optional parameter. When provided, queries are scoped to that user (multi-tenant mode). When omitted, all records are accessible (single-tenant mode). - Single-tenant mode — Core can now be used without any user/auth model. Create and manage links, view analytics, and configure webhooks without providing a
userId. - WebSocket live debug stream no longer requires
userId— WhenuserIdis omitted, the/api/debug/liveWebSocket streams all click events.
userstable DDL andidx_users_emailindex frominitializeDatabase()JWT_SECRETand email configuration sections from.env.exampleUser,Organization,AppConfig,OrganizationSettingsinterfaces from types
- Add SDK resolve endpoint for App Links and Universal Links deep linking (
GET /api/sdk/v1/resolve/:shortCodeandGET /api/sdk/v1/resolve/:templateSlug/:shortCode) — returns deep link data as JSON when the mobile OS intercepts a LinkForty URL before the server can process the redirect - Include
deep_link_parametersin deferred deep linking responses from/api/sdk/v1/installand/api/sdk/v1/attribution/:fingerprint
- Fix deferred deep links not returning custom parameters — the install attribution query now selects
deep_link_parametersfrom the links table and includes them in the SDK response
- Add debugging and testing routes for link validation (c51d68c)
- Add deferred deep linking with probabilistic fingerprint matching (03c1d3e)
- Add event emitter for real-time click event streaming (5641adf)
- Add OG tags and attribution windows to link API (0b3cd3c)
- Add Open Graph preview route for social media scrapers (1402d65)
- Add Open Graph tags, attribution windows, and description to links schema (ed6575f)
- Add QR code generation for short links (3601b2c)
- Emit real-time click events and fix device detection (331900c)
- Export new routes and modules (6e874bb)
- Update Link types with OG tags and attribution windows (5fa2686)