Guillotine
URL shortening hobby kit
Install / Use
/learn @technoweenie/GuillotineREADME
Guillotine
Simple URL Shortener hobby kit. Currently used to shorten URLs at GitHub.com, and also available as a an installable Heroku app.
USAGE
The easiest way to use it is with the built-in memory adapter.
# app.rb
require 'guillotine'
module MyApp
class App < Guillotine::App
adapter = Guillotine::Adapters::MemoryAdapter.new
set :service => Guillotine::Service.new(adapter)
get '/' do
redirect 'https://homepage.com'
end
end
end
# config.ru
require "rubygems"
require File.expand_path("../app.rb", __FILE__)
run MyApp::App
Once it's running, add URLs with a simple POST.
curl http://localhost:4567 -i \
-F "url=http://techno-weenie.net"
You can specify your own code too:
curl http://localhost:4567 -i \
-F "url=http://techno-weenie.net" \
-F "code=abc"
Sequel
The memory adapter sucks though. You probably want to use a DB. Check out the Sequel gem for more examples. It'll support SQLite, MySQL, PostgreSQL, and a bunch of other databases.
require 'guillotine'
require 'sequel'
module MyApp
class App < Guillotine::App
db = Sequel.sqlite
adapter = Guillotine::Adapters::SequelAdapter.new(db)
set :service => Guillotine::Service.new(adapter)
end
end
You'll need to initialize the DB schema with something like this (depending on which DB you use):
CREATE TABLE IF NOT EXISTS `urls` (
`url` varchar(255) DEFAULT NULL,
`code` varchar(255) DEFAULT NULL,
UNIQUE KEY `url` (`url`),
UNIQUE KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Redis
Redis works well, too. The sample below is adapted from Katana, a hosted wrapper around Guillotine designed for Heroku.
require 'guillotine'
require 'redis'
module MyApp
class App < Guillotine::App
# use redis adapter with redistogo on Heroku
uri = URI.parse(ENV["REDISTOGO_URL"])
redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
adapter = Guillotine::Adapters::RedisAdapter.new(redis)
set :service => Guillotine::Service.new(adapter)
end
end
Riak
If you need to scale out your url shortening services across the cloud, you can use Riak!
require 'guillotine'
require 'riak/client'
module MyApp
class App < Guillotine::App
client = Riak::Client.new :protocol => 'pbc', :pb_port => 8087
bucket = client['guillotine']
adapter = Guillotine::Adapters::RiakAdapter.new(bucket)
set :service => Guillotine::Service.new(adapter)
end
end
Cassandra
you can use Cassandra!
require 'guillotine'
require 'cassandra'
module MyApp
class App < Guillotine::App
cassandra = Cassandra.new('url_shortener', '127.0.0.1:9160')
adapter = Guillotine::Adapters::CassandraAdapter.new(cassandra)
set :service => Guillotine::Service.new(adapter)
end
end
You need to create keyspace and column families as below
CREATE KEYSPACE url_shortener;
USE url_shortener;
CREATE COLUMN FAMILY urls
WITH comparator = UTF8Type
AND key_validation_class=UTF8Type
AND column_metadata = [{column_name: code, validation_class: UTF8Type}];
CREATE COLUMN FAMILY codes
WITH comparator = UTF8Type
AND key_validation_class=UTF8Type
AND column_metadata = [{column_name: url, validation_class: UTF8Type}];
Domain Restriction
You can restrict what domains that Guillotine will shorten.
require 'guillotine'
module MyApp
class App < Guillotine::App
adapter = Guillotine::Adapters::MemoryAdapter.new
# only this domain
set :service => Guillotine::Service.new(adapter,
:required_host => 'github.com')
# or, any *.github.com domain
set :service => Guillotine::Service.new(adapter,
:required_host => /(^|\.)github\.com$/)
# or set a simple wildcard
set :service => Guillotine::Servicew.new(adapter,
:required_host => '*.github.com')
end
end
Not TODO
- Statistics
- Authentication
Related Skills
node-connect
351.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
110.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
351.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
351.4kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
