A library to notify about any (pluggable) activity on your machine, and let you take action as needed

Activity tracker

Mentioned in Awesome Go codecov Go Report Card version

It is a libary that lets you monitor certain activities on your machine, and then sends a heartbeat at a periodic (configurable) time detailing all the activity changes during that time. The activities that you want to track are monitored by pluggable handlers for those activities and can be added or removed according to your needs. An example of an activity is MouseCursorActivity, i.e. whether your mouse cursor was moved or not.

Installation

go get -u github.com/prashantgupta24/activity-tracker

Usage

heartbeatInterval := 60 //value always in seconds
workerInterval := 5     //seconds

activityTracker := &tracker.Instance{
	HeartbeatInterval: heartbeatInterval,
	WorkerInterval:    workerInterval,
	LogLevel:          logging.Info,
}

//This starts the tracker for all handlers currently implemented. It gives you a channel on
//which you can listen to for heartbeat objects
heartbeatCh := activityTracker.Start()

//if you only want to track certain handlers, you can use StartWithhandlers
//heartbeatCh := activityTracker.StartWithHandlers(handler.MouseClickHandler(), handler.MouseCursorHandler())


select {
case heartbeat := <-heartbeatCh:
	if !heartbeat.WasAnyActivity {
		logger.Infof("no activity detected in the last %v seconds", int(heartbeatInterval))
	} else {
		logger.Infof("activity detected in the last %v seconds.", int(heartbeatInterval))
		logger.Infof("Activity type:\n")
		for activityType, times := range heartbeat.ActivityMap {
			logger.Infof("activityType : %v times: %v\n", activityType, len(times))
		}
	}
}

Output

The above code created a tracker with all (Mouse-click, Mouse-movement, screen-change and machine-sleep) handlers activated. The heartbeat Interval is set to 60 seconds, i.e. every 60 seconds I received a heartbeat which mentioned all activities that were captured.

INFO[2019-03-30T15:52:01-07:00] starting activity tracker with 60s heartbeat and 5s worker Interval... 

INFO[2019-03-30T15:53:01-07:00] activity detected in the last 60 seconds.    

INFO[2019-03-30T15:53:01-07:00] Activity type:                               
INFO[2019-03-30T15:53:01-07:00] activityType : mouse-click times: 10         
INFO[2019-03-30T15:53:01-07:00] activityType : cursor-move times: 12
INFO[2019-03-30T15:53:01-07:00] activityType : screen-change times: 7
INFO[2019-03-30T15:53:01-07:00] activityType : machine-sleep times: 1
INFO[2019-03-30T15:53:01-07:00] activityType : machine-wake times: 1

How it works

There are 2 primary configs required for the tracker to work:

  • HeartbeatInterval

The Interval at which you want the heartbeat (in seconds, default 60s)

  • WorkerInterval

The Interval at which you want the checks to happen within a heartbeat (default 60s).

The activity tracker gives you a heartbeat object every 60 seconds, that is based on the HeartbeatInterval. But there is something else to understand here. In order for the tracker to know how many times an activity occured, like how many times you moved the cursor for example, it needs to query the mouse position every x seconds. That's where the WorkerInterval comes into play.

The WorkerInterval tells the tracker how frequently to check for an activity within a heartbeat. It does that by querying the handler associated with that activity. Let's say you want to know how many times the mouse cursor was moved within 60 seconds. You need to constantly ask the mouseCursorHandler every x seconds to see if the cursor moved. What you want to do is to start the tracker with the usual 60s HeartbeatInterval , configured with a Mouse-cursor handler. In this case, you set the WorkerInterval to 5 seconds. The tracker will then keep asking the mouse cursor handler every 5 seconds to see if there was a movement, and keep track each time there was a change. At the end of HeartbeatInterval, it will construct the heartbeat with all the changes and send it.

For example, in the output that you saw above, it says cursor-move times: 12. That doesn't mean the cursor was moved only 12 times. Since the WorkerInterval was 5 seconds in the example, that means cursorHandler was asked every 5 seconds (i.e. 12 times in 60 seconds) whether the cursor moved. And it replied that the cursor had indeed moved everytime.

Note : This is applicable only to pull-based handlers. For push-based handlers, WorkerInterval does not matter.

  • If you want to know how many times an activity occured within a heartbeat, you might want to set the WorkerInterval to a low value, so that it keeps quering the handlers.

  • If you are just concerned whether any activity happened within a heartbeat or not, you can set WorkerInterval to a high number (something around 10-15 seconds should do the trick). That way, the workers need not be bothered a lot of times within a heartbeat.

Note: If the WorkerInterval and the HeartbeatInterval are set the same, then the WorkerInterval always is started a fraction of a second before the HeartbeatInterval kicks in. This is done so that when the heartbeat is going to be generated at the end of HeartbeatInterval, the worker should have done its job of querying each of the handlers before that.

Usecase

Suppose you want to track Activities A, B and C on your machine, and you want to know how many times they occured every minute.

You want a report at the end of every minute saying Activity A happened 5 times, Activity B happened 3 times and Activity C happened 2 times.

First, you need to create a Handler for each of those activities. See sections below on how to create one. The main tracker object will simply ask each of the handlers every WorkerInterval amout of time whether that activity happened or not at that moment.

As another example, let's say you want to monitor whether there was any mouse click on your machine and you want to be notified every 5 minutes. What you do is start the Activity Tracker with just the mouse click handler and heartbeat Interval set to 5 minutes. The Start function of the library gives you a channel which receives a heartbeat every 5 minutes, and it has details on whether there was a click in those 5 minutes, and if yes, the times the click happened.

Components

Heartbeat struct

It is the data packet sent from the tracker library to the user.

type Heartbeat struct {
	WasAnyActivity bool
	ActivityMap    map[activity.Type][]time.Time //activity type with its times
	Time           time.Time                     //heartbeat time
}

WasAnyActivity tells if there was any activity within that time frame If there was, then the ActivityMap will tell you what type of activity it was and what all times it occured.

The Time field is the time of the Heartbeat sent (not to be confused with the activity time, which is the time the activity occured within the heartbeat).

Tracker

The tracker is the main struct for the library. The fields inside it are:

HeartbeatInterval int //the interval at which you want the heartbeat (in seconds, default 60s)
WorkerInterval    int //the interval at which you want the checks to happen within a heartbeat (in seconds, default 5s)
LogLevel          string //info or debug
LogFormat         string //text or json

- HeartbeatInterval

The Interval at which you want the heartbeat (in seconds, default 60s)

The HeartbeatInterval value can be set anywhere between 60 seconds - 300 seconds. Not setting it or setting it to anything other than the allowed range will revert it to default of 60s.

- WorkerInterval

The Interval at which you want the checks to happen within a heartbeat (default 60s).

The WorkerInterval value can be set anywhere between 4 seconds - 60 seconds. It CANNOT be more than HeartbeatInterval for obvious reasons. Not setting it or setting it to anything other than the allowed range will revert it to default of 60s.

State

The system.State struct captures the current state of the tracker, and the whole system in general. It is used by some of the handlers to respond to a certain system state.

It is passed to the handlers when performing the Trigger, so that the handlers can take an informed decision on whether to get activated or not at that instance.

For example, the sleepHandler changes the state of the system to sleeping, so that the mouseCursorHandler and mouseClickHandler don't need to do any work while the system remains in the sleep state.

Note: It also serves as a way of inter-handler communication.

Types of handlers

There are 2 types of handlers:

  • Push based
  • Pull based

The push based ones are those that automatically push to the tracker object when an activity happened. Examples are the mouseClickHander and machineSleepHandler. Whenever a mouse-click/machine-sleep happens, it sends the activity to the tracker object.

The pull based ones are those that the tracker has to ask the handler to know if there was any activity happening at that moment. Examples are mouseCursorHandler and screenChangeHandler. The asking is done through the Trigger function implemented by handlers.

It is up to you to define how to implement the handler. Some make sense to be pull based, since it is going to be memory intensive to make the mouse cursor movement handler push-based. It made sense to make it pull based.

New pluggable handlers for activities

//Handler interface
Start(*log.Logger, chan *activity.Instance)
Type() activity.Type
Trigger(system.State) //used to activate pull-based handlers
Close()

Any new type of handler for an activity can be easily added, it just needs to implement the above Handler interface and define what type of activity it is going to track (also add the new activity as well if it's a new activity), that's it! It can be plugged in with the tracker and then the tracker will include those activity checks in its heartbeat.

Note: Handlers have a one-to-many relationship with activity, i.e. each Handler can be associated with one or more activity (That becomes the value returned by handler's Type) On the other hand, each activity should be tracked by only ONE handler (which makes sense). As a fail-safe, if the tracker is started with more than one handler tracking the same activity, then only 1 handler will get registered for that activity.

Currently supported list of activities/handlers

Activities

MouseCursorMovement Type = "cursor-move"
MouseClick          Type = "mouse-click"
ScreenChange        Type = "screen-change"
MachineSleep        Type = "machine-sleep"
MachineWake         Type = "machine-wake"

Corresponding handlers

mouseCursorHandler
mouseClickHandler
screenChangeHandler
machineSleepHandler
  • Mouse click (whether any mouse click happened during the time frame)
  • Mouse cursor movement (whether the mouse cursor was moved during the time frame)
  • Screen change handler (whether the active window was changed)
  • Machine sleep/wake handler (this is added by default for fail-safe measures)

Thanks to robotgo for making a lot of the handlers possible.

Example

Check out the example here

Projects using this library

Similar Resources

A CoreDNS plugin to serve temporary TXT records for validation purposes (eg. Let's Encrypt DNS-01)

temptxt Name temptxt - serves TXT records for validation purposes (eg. ACME DNS-01 challenge) updated through a HTTP api. Description The temptxt plug

Aug 23, 2022

Minekube Connect allows you to connect any Minecraft server

Minekube Connect allows you to connect any Minecraft server, whether online mode, public, behind your protected home network or anywhere else in the world, with our highly available, performant and low latency edge proxies network nearest to you.

Dec 27, 2022

Run this bot on machine where your qbittorrent has been installed

Telegram bot for qbittorrent Run this bot on machine where your qbittorrent has been installed. Qbittorrent settings Activate Web Interface or use hea

Jan 13, 2022

Deskreen turns any device with a web browser into a secondary screen for your computer

Deskreen turns any device with a web browser into a secondary screen for your computer

Deskreen Website: https://deskreen.com ▶️ Deskreen Youtube channel (video tutorials, demos, use cases for Deskreen day to day usage) Deskreen turns an

Jan 7, 2023

[WIP] gg is a portable tool to redirect the traffic of a given program to your modern proxy without installing any other programs.

gg gg (go-graft), was inspired by graftcp. go-graft is a pure golang implementation with more useful features. TODO: Use system DNS as the fallback. R

Dec 28, 2022

Send email and SMS broadcasts to your contacts. SMS are sent via your Android phone connected to your PC.

Polysender Send email and SMS broadcasts to your contacts. Polysender is a desktop application, so it does not require a complicated server setup. Ema

Aug 11, 2022

Simple application in Golang that retrieves your ip and updates your DNS entries automatically each time your IP changes.

DNS-Updater Simple application in Golang that retrieves your ip and updates your DNS entries automatically each time your IP changes. Motivation Havin

Mar 10, 2022

A quick and dirty but useful tool to download each text/html page from the wayback machine for a specific domain and search for keywords within the saved content

wayback-keyword-search A quick and dirty but useful tool to download each text/html page from the wayback machine for a specific domain and search for

Dec 2, 2022

gh is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to the terminal next to where you are already working with git and your code

gh is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to the terminal next to where you are already working with git and your code

gh is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to the terminal next to where you are already working with git and your code

Jan 24, 2022
Comments
  • Mac sleep causes app to crash

    Mac sleep causes app to crash

    fatal error: unexpected signal during runtime execution
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x4264e7c]
    
    runtime stack:
    runtime.throw(0x43376a1, 0x2a)
            /usr/local/Cellar/go/1.11.1/libexec/src/runtime/panic.go:608 +0x72
    runtime.sigpanic()
            /usr/local/Cellar/go/1.11.1/libexec/src/runtime/signal_unix.go:374 +0x2f2
    
    goroutine 3854 [syscall]:
    runtime.cgocall(0x426c0c0, 0xc000315f28, 0x3)
            /usr/local/Cellar/go/1.11.1/libexec/src/runtime/cgocall.go:128 +0x5e fp=0xc000315ef0 sp=0xc000315eb8 pc=0x4005cfe
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/go-vgo/robotgo._Cfunc_get_pixel_color(0x2d0, 0x1c2, 0x0)
            _cgo_gotypes.go:607 +0x4e fp=0xc000315f28 sp=0xc000315ef0 pc=0x425d77e
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/go-vgo/robotgo.GetPixelColor(0x2d0, 0x1c2, 0x426037f, 0xc0001b6001)
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/go-vgo/robotgo/robotgo.go:192 +0x35 fp=0xc000315f68 sp=0xc000315f28 pc=0x425d985
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service.checkScreenChange(0xc0000c0780, 0xc00013a088, 0x6, 0x2d0, 0x1c2)
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service/screenChangeHandler.go:68 +0x39 fp=0xc000315fb8 sp=0xc000315f68 pc=0x42604f9
    runtime.goexit()
            /usr/local/Cellar/go/1.11.1/libexec/src/runtime/asm_amd64.s:1333 +0x1 fp=0xc000315fc0 sp=0xc000315fb8 pc=0x4059c11
    created by github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service.(*screenChangeHandler).Start.func1
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service/screenChangeHandler.go:32 +0x1ce
    
    goroutine 1 [syscall, 44 minutes, locked to thread]:
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/getlantern/systray._Cfunc_nativeLoop(0xc000000000)
            _cgo_gotypes.go:107 +0x49
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/getlantern/systray.nativeLoop()
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/getlantern/systray/systray_nonwindows.go:19 +0x22
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/getlantern/systray.Run(0x433f930, 0x433f920)
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/getlantern/systray/systray.go:81 +0x7e
    main.main()
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/cmd/main.go:12 +0x39
    
    goroutine 4 [select, 44 minutes]:
    main.onReady.func1()
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/cmd/main.go:27 +0x1ee
    created by main.onReady
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/cmd/main.go:16 +0x35
    
    goroutine 20 [chan receive]:
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service.(*mouseClickHandler).Start.func1(0xc0000a64e0, 0xc000082360, 0xc0000a40a0)
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service/mouseClickHandler.go:21 +0x77
    created by github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service.(*mouseClickHandler).Start
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service/mouseClickHandler.go:19 +0xa1
    
    goroutine 21 [chan receive]:
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service.(*mouseCursorHandler).Start.func1(0xc0000a40a8, 0xc0000a64e0)
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service/mouseCursorHandler.go:26 +0x67
    created by github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service.(*mouseCursorHandler).Start
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service/mouseCursorHandler.go:24 +0x75
    
    goroutine 22 [select]:
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service.(*screenChangeHandler).Start.func1(0xc0000a40b0, 0xc0000a64e0)
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service/screenChangeHandler.go:33 +0x274
    created by github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service.(*screenChangeHandler).Start
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service/screenChangeHandler.go:24 +0x75
    
    goroutine 23 [select]:
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/pkg/tracker.(*Instance).StartWithServices.func1(0xc0000a40b8, 0xc0000aa460)
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/pkg/tracker/tracker.go:32 +0x158
    created by github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/pkg/tracker.(*Instance).StartWithServices
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/pkg/tracker/tracker.go:23 +0xf3
    
    goroutine 24 [select]:
    github.com/prashantgupta24/automatic-mouse-mover/pkg/mousemover.(*mouseMover).Start.func1(0xc0000a6540, 0xc0000aa460, 0xc00008ceb0)
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/pkg/mousemover/mouseMover.go:37 +0xe9
    created by github.com/prashantgupta24/automatic-mouse-mover/pkg/mousemover.(*mouseMover).Start
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/pkg/mousemover/mouseMover.go:33 +0xb2
    
    goroutine 75 [syscall, 44 minutes]:
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/go-vgo/robotgo/vendor/github.com/robotn/gohook._Cfunc_add_event(0xbe01170, 0x0)
            _cgo_gotypes.go:68 +0x49
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/go-vgo/robotgo/vendor/github.com/robotn/gohook.AddEvent(0x432b04c, 0x5, 0x0)
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/go-vgo/robotgo/vendor/github.com/robotn/gohook/hook.go:185 +0x76
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/go-vgo/robotgo.AddEvent(0x432b04c, 0x5, 0x0)
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/go-vgo/robotgo/robotgo.go:1219 +0xf2
    github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service.addMouseClickRegistration(0xc0000a64e0, 0xc000082360)
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service/mouseClickHandler.go:59 +0x64
    created by github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service.(*mouseClickHandler).Start.func1
            /Users/prashantgupta/go/src/github.com/prashantgupta24/automatic-mouse-mover/vendor/github.com/prashantgupta24/activity-tracker/internal/pkg/service/mouseClickHandler.go:27 +0x178
    exit status 2
    
  • CI failing

    CI failing

    Seems like an issue with the robotgo library, due to this the CI is failing:

    go: downloading github.com/pmezard/go-difflib v1.0.0
    ?   	github.com/prashantgupta24/activity-tracker	[no test files]
    ?   	github.com/prashantgupta24/activity-tracker/example	[no test files]
    ?   	github.com/prashantgupta24/activity-tracker/internal/pkg/logging	[no test files]
    ?   	github.com/prashantgupta24/activity-tracker/internal/pkg/mouse	[no test files]
    ?   	github.com/prashantgupta24/activity-tracker/internal/pkg/service	[no test files]
    ?   	github.com/prashantgupta24/activity-tracker/pkg/activity	[no test files]
    on_library_load [448]: XOpenDisplay failure!
    load_input_helper [1899]: XkbGetKeyboard failed to locate a valid keyboard!
    FAIL	github.com/prashantgupta24/activity-tracker/pkg/tracker	0.166s
    
  • To do

    To do

    Must-haves

    • [x] License
    • [x] Tests
    • [x] Test code coverage
    • [x] Handle signals (like mac being put to sleep, tracked here)
    • [x] Individual channel for each service
    • [x] Whether we need to pass variables to go func or rely on closure
    • [x] Refactoring packages
    • [x] Screen change handler
    • [x] Make service handler as map, check for duplicate service registry
    • [x] Introduce timeout for each handler
    • [x] services as interfaces
    • [x] overloaded start function that accepts services
    • [x] introduce logging

    Enhancements

    • [ ] Tests CI (facing issue)
    • [ ] Multiple event registration (dependent on robotgo next release)
    • [ ] Include context
    • [x] Switch to go mod
    • [ ] Enhance click handler
    • [ ] Enhance screen change with multiple pixels
    • [ ] Add channels' direction sense

    Documentation

    • [ ] Go docs
    • [x] Improve readme
    • [x] Add comments
    • [x] Add badges
Temporal Activity Protobuf Generator Proof of Concept

Temporal Activity Protobuf Generator Proof of Concept This is a protoc plugin for generating easy to use code for calling and implementing activities.

Oct 5, 2022
Helps you to send ssh commands to target machine in your local network from outside via gRPC
Helps you to send ssh commands to target machine in your local network from outside via gRPC

rpc-ssh In case, you don't want to make your ssh port accessible from outside local network. This repository helps you to send ssh commands to target

Nov 16, 2022
A pluggable backend API that enforces the Event Sourcing Pattern for persisting & broadcasting application state changes
A pluggable backend API that enforces the Event Sourcing Pattern for persisting & broadcasting application state changes

A pluggable "Application State Gateway" that enforces the Event Sourcing Pattern for securely persisting & broadcasting application state changes

Nov 1, 2022
Judas is a pluggable phishing proxy.

Judas is a pluggable phishing proxy.

Jul 11, 2022
Pluggable Go server to generate Powerline segments
Pluggable Go server to generate Powerline segments

gowerline Because Python is hard and I've always wanted to write my segments in Go. What is this ? This is a deamon that generates and returns Powerli

Jul 25, 2022
meek is a blocking-resistant pluggable transport for Tor.

meek is a blocking-resistant pluggable transport for Tor. It encodes a data stream as a sequence of HTTPS requests and responses. Requests are reflect

Nov 9, 2021
Take an IP address and quickly get the reverse PTR

FlipIP Just a little quick app to take an IP (or set of IPs), and convert them to reverse IP pointers Example: $ flipip 1.2.3.4 4.3.2.1.in-addr.arpa.

Feb 27, 2022
Let's implement some basic ZeroMQ publisher and subscriber in Golang. Utilize Envoy as a proxy.
Let's implement some basic ZeroMQ publisher and subscriber in Golang. Utilize Envoy as a proxy.

Envy proxy with ZeroMQ Solution tested on DigitalOcean Droplet. In case of re-creation VM follow this article. Introduction Let's implement some basic

Jan 25, 2022
Peoplenect - Keep track of all your professional connections on your machine

Peoplenect Keep track of all your professional connections. TODO Create database

Jun 2, 2022
Reverse Proxying + Static File Serving + Let's Encrypt + multiple hosts

Slashing This is a HTTPS server, which aims to replace my personal nginx usages. Currently, it serves Reverse Proxying (e.g. to a Python-Flask,Java,PH

Jul 29, 2021