func (s *Server) serveMarkdown(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "text/markdown")
	for i := 0; i < 100; i++ {
		fmt.Fprintf(w, `[<img src="%s/sponsor/avatar/%d" width="35">](%s/sponsor/profile/%d)`, s.URL, i, s.URL, i)
		fmt.Fprintf(w, "\n")
	}
}
serveMarkdown serves a list of markdown links which you can copy/paste into your Readme.
package sponsors
import (
	"bytes"
	"context"
	"fmt"
	"image"
	"image/color"
	"image/draw"
	"image/png"
	"io"
	"log"
	"net/http"
	"strconv"
	"strings"
	"sync"
	"time"
	"github.com/shurcooL/githubv4"
)
var pixel []byte
func init() {
	var buf bytes.Buffer
	r := image.Rect(0, 0, 1, 1)
	img := image.NewRGBA(r)
	c := color.RGBA{0xF8, 0xF9, 0xFA, 0xFF}
	draw.Draw(img, r, &image.Uniform{c}, image.ZP, draw.Src)
	png.Encode(&buf, img)
	pixel = buf.Bytes()
}
type Sponsor struct {
	Name string
	Login string
	AvatarURL string
}
type Server struct {
	URL string
	Client *githubv4.Client
	CacheTTL time.Duration
	mu             sync.Mutex
	cacheTimestamp time.Time
	cache          []Sponsor
}
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	ctx := r.Context()
	path := r.URL.Path
	start := time.Now()
	log.Printf("%s %s", r.Method, path)
	defer func() {
		log.Printf("%s %s -> %s", r.Method, path, time.Since(start))
	}()
	err := s.primeCache(ctx)
	if err != nil {
		log.Printf("error priming cache: %s", err)
		http.Error(w, "Error fetching sponsors", http.StatusInternalServerError)
		return
	}
	switch {
	case strings.HasPrefix(path, "/sponsor/markdown"):
		s.serveMarkdown(w, r)
	case strings.HasPrefix(path, "/sponsor/avatar"):
		s.serveAvatar(w, r)
	case strings.HasPrefix(path, "/sponsor/profile"):
		s.serveProfile(w, r)
	default:
		http.Error(w, "Not Found", http.StatusNotImplemented)
	}
}