the javascript stores the links that needs to be open in a js local database and the python scripts polls the databases every 250ms for links that need to be open and cleans up the databases. It's a hack but it works. The javascript part: var db = openDatabase("LinksFollow", "1.0"); var dbOK = false; if (!db) alert("Failed to open the database on disk. This is probably because the version was bad or there is not enough space left in this domain's quota"); db.transaction(function(tx) { tx.executeSql("SELECT COUNT(*) FROM Links", [], function(result) { dbready(); }, function(tx, error) { tx.executeSql("CREATE TABLE Links (url TEXT, timestamp REAL)", [], function(result) { dbready(); }); }); }); function dbready(){ dbOk = true; } function newlink(link){ if(!dbOk) alert("Database not ready!"); db.transaction(function (tx) { tx.executeSql("INSERT INTO Links (url,timestamp) VALUES (?,?)", [link, new Date().getTime()]); }); } Python script: import sqlite3 import sys import os import time base_path = os.environ['XDG_DATA_HOME'] webkit_databases = base_path + "/webkit/databases" main_datbase = webkit_databases + "/Databases.db" browsercommand = ['/usr/bin/uzbl','-u'] #CREATE TABLE Databases (guid INTEGER PRIMARY KEY AUTOINCREMENT, origin TEXT, name TEXT, displayName TEXT, estimatedSize INTEGER, path TEXT); while True: conn = sqlite3.connect(main_datbase) databases = conn.execute("SELECT origin,path FROM Databases WHERE name = 'LinksFollow'") for database in databases: path , name = database database = "%s/%s/%s" % (webkit_databases,path,name) if not os.path.exists(database): continue try: current = sqlite3.connect(database) links = current.execute("select * from Links") for link in links: cmd = browsercommand + [link[0]] os.spawnl(os.P_NOWAIT, cmd[0], * cmd) os.unlink(database) except: print "Can't connect to %s" % database conn.execute("DELETE FROM Databases WHERE name = 'LinksFollow'") conn.commit() conn.close() del conn time.sleep(0.250)