Skip to content

Instantly share code, notes, and snippets.

View zapnap's full-sized avatar
👾

nap zapnap

👾
View GitHub Profile
@zapnap
zapnap / RFC-E2EE-DM-KEYRING.md
Created August 7, 2026 16:46
freeq RFC draft v0.1: encrypted DMs with durable, multi-device history (the keyring model) — for contributor discussion

RFC: Encrypted DMs with durable, multi-device history (the keyring model)

Abstract

This RFC proposes how freeq DMs become private without becoming losable. Each conversation encrypts under a stable key; the server stores only ciphertext; all conversation keys live in an encrypted keyring, unlocked by a secret that only the user's own devices ever hold — carried to a new device by an add-device handoff, or restored after total loss from a user-held recovery secret. The per-message ratchet retires as the DM transport. The PDS holds nothing — neither secret nor backup: preferences are readable and writable by every app the user has ever authorized (§5). The keyring synchronization model — device-local working copies, one home-server serializer, restore-only backups — and its open questions are §7.

Draft v0.1, 2026-08-07 — for contributor discussion.

1. Requirements

@zapnap
zapnap / freeq-handoff-rfc.md
Last active July 2, 2026 17:29 — forked from chad/freeq-handoff-rfc.md
RFC (draft): freeq.at/handoff — a durable, signed task-handoff primitive for IRCv3

RFC v0.3: freeq.at/act — stateful, signed, addressed actions for IRCv3

(with handoff as the first action kind)

Status: draft / request for comments · Authors: Chad Fowler & zapnap (freeq) · Audience: agent-coordination builders, IRCv3, AT Protocol

This is a casual RFC. Poke holes in it.

What changed since v0.2: (1) Addressing is DID-native end-to-end — a cross-server nick DM has no well-defined recipient today, so directed actions key off the act-to DID for delivery, persistence, and validation, with the nick as display only. (2) Transition authority is the minting server — for every action, directed or open, the server that minted the act-id serializes transitions and resolves races; a federated channel has no "home server" and a multi-homed recipient has no single one either, so authority follows the one thing that's unambiguous, the offer's origin. (v0.2 put directed-action authority on the recipient's server; this unifies it.) (3) Signing — two things. Verif

@zapnap
zapnap / crypto_trackers.md
Last active March 18, 2026 00:07
List of various cryptocurrency portfolio trackers and dashboards
Name Website Access Data Import (API/CSV) Trading Charts Login Required Transactions, P&L Coin Location **Tax Advisor ** Social Features Alerts Analysis Price Notes
Blockfolio http://blockfolio.com/ Mobile-only (Android, iOS) No Yes No* Yes Yes* No No No Free Desktop app "coming soon"
Delta https://getdelta.io/ Mac Desktop, iOS, Android No Yes No Yes Yes* No No Yes Free + Upgrade ($) Nice modern UI. Desktop app available as of March 2018
Lionshare https://lionshare.capital/ Mac Desktop & iOS No No No No No No No No Free, OSS
CryptoCompare http://cryptocompare.com/ Web App No? Yes Yes Yes Yes* No Yes No Free Portfolio is one part of a far larger community app
AltPocket h
Verifying my Blockstack ID is secured with the address 1LdX1QrtkNCKAuMp5ZUst1LZKQwQJDKcbg https://explorer.blockstack.org/address/1LdX1QrtkNCKAuMp5ZUst1LZKQwQJDKcbg
@zapnap
zapnap / keybase.md
Created July 24, 2014 18:36
keybase.md

Keybase proof

I hereby claim:

  • I am zapnap on github.
  • I am nap (https://keybase.io/nap) on keybase.
  • I have a public key whose fingerprint is F1CA FCB8 79B5 7AD7 6EB2 24E2 81F4 3ACE C5E1 C4E4

To claim this, I am signing this object:

@zapnap
zapnap / abstract_methods.rb
Created June 15, 2014 21:05
abstract base class mixin
module AbstractMethods
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def abstract_methods(*args)
args.each do |name|
class_eval(<<-END, __FILE__, __LINE__)
def #{name}(*args)
curl -XDELETE 'localhost:9200/test'
curl -XPUT 'localhost:9200/test/data/1' -d '
{
"numbers":[11,23,13,16,17,23.6]
},
'
@zapnap
zapnap / algolia_mongoid_batch_find.rb
Created February 11, 2014 21:59
More efficient find_in_batches for Algolia + Mongoid
module AlgoliaMongoidBatchFind
# more efficient than the built-in adapter for bulk reindexing (mongoid adapter)
def algolia_find_in_batches(options={}, &block)
options[:batch_size] ||= 100
offset = 0
offset.step(Product.count, options[:batch_size]) do |offset|
yield Product.limit(options[:batch_size]).skip(offset).to_a
end
end
end
#= require application
#= require angular-mocks
#= require sinon
#= require jasmine-sinon
beforeEach(module('AngularApp'))
beforeEach inject (_$httpBackend_, _$compile_, $rootScope, $controller, $location, $injector, $timeout) ->
@scope = $rootScope.$new()
@http = _$httpBackend_
#= require spec_helper
describe 'TasksController', ->
beforeEach ->
@controller('TasksController', { $scope: @scope })
@Task = @model('Task')
@tasks = [new @Task({ id: 1, name: 'first task' })]
@http.whenGET('/api/tasks').respond(200, @tasks)
@http.flush()