Code Monkey home page Code Monkey logo

f1's Introduction

WARNING: THIS REPOSITORY IS DEPRECATED!

The "F1" project, a way to share links implemented as a Firefox extension, has been converted to (and thus superseded by) Firefox's "Share" feature. The web app portion of this project is now available in the following repositories:

The browser extension portion of this project has been rolled into Firefox itself.

ACTIVE DEVELOPMENT IS NO LONGER HAPPENING IN THIS REPOSITORY.

Thanks!

f1

A link sharing service that consists of a Firefox extension and a web service.

The firefox extension creates an area to show the share UI served from the web service.

The web service handles the OAuth work and sending of messages to different share servers.

Some directory explanations:

  • extensions: holds the Firefox extension source.
  • web: holds the UI for the web service.
  • grinder: a load testing tool.
  • tools: deployment tools.
  • The rest of the files support the web service.

Installation and Setup

Get the f1 repository:

git clone https://github.com/mozilla/f1.git
cd f1

Setup dependencies:

make build

If you are on OS X and you get errors or it does not work, see the OS X troubleshooting section below.

Start the virtualenv

source bin/activate

Running f1

Run the web server. 'reload' is useful for development, the webserver restarts on file changes, otherwise you can leave it off

paster serve --reload development.ini

Then visit: http://127.0.0.1:5000/ for an index of api examples

Troubleshooting OS X installs

If the make build command produced errors or results in not being able to start up the server, use the following steps. It is suggested you re-clone F1 before doing the following steps, so that it starts out with a clean environment.

  1. Make sure XCode 3 is installed.

  2. Build your own version of Python:

    sudo svn co http://svn.plone.org/svn/collective/buildout/python/ sudo chown -R $USER ./python cd python vi buildout.cfg: then remove any references to python 2.4 and 2.5 python bootstrap.py ./bin/buildout cd /usr/local/bin sudo ln -s /opt/python/bin/virtualenv-2.6 virtualenv

  3. Now edit your .profile to make sure that if you have MacPorts installed, its PATH and MANPATH variables are last in the list for those environment variables.

I also removed export PYTHONPATH=/Users/aaa/hg/raindrop/server/python:$PYTHONPATH and removed /Library/Frameworks/Python.framework/Versions/Current/bin from the $PATH variable.

  1. Build C libraries via Homebrew:

Homebrew installs into /usr/local by default, and it is best if you chown the files in there to you:

sudo chown -R $USER /usr/local

If installed things before in these directories, remove these directories: /usr/local/include and /usr/local/lib

ruby -e "$(curl -fsSLk https://gist.github.com/raw/323731/install_homebrew.rb)"
brew install memcached libmemcached

Then try the make build command above and continue from there.

Setting up a valid Google domain for OpenID+OAuth

You have to have access to a valid domain that google can get to and where you can install an html file.

Visit: https://www.google.com/accounts/ManageDomains

Add your domain, follow the rest of their instructions.

To test: Once that is done, you can bypass normal access to your domain by adding to your /etc/hosts file:

127.0.0.1 your.host.com

Update development.ini and add your key/secret for the google configuration, restart paster.

Then in the web browser, hit f1 with http://your.host.com.

f1's People

Contributors

anantn avatar billrest avatar clarkbw avatar davidascher avatar erikvold avatar gozer avatar gozer-mozillamessaging avatar jrburke avatar mhammond avatar mixedpuppy avatar philikon avatar rafrombrc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

f1's Issues

successful post that didn't go through

possibly related to issue #32 Karen had a post to facebook today that appeared to go through. However it never showed up in Facebook and she didn't receive an error message of any kind. Wondering if there is some information in the logs

On the next time trying to post the same link she got the "need to sign in" notification and resulting dialog that didn't complete on it's own.

One possibly related item is that she changed her facebook password yesterday. However I feel like that is not related.

facebook profile error

[Thu Nov 18 07:17:10 2010] [error] Traceback (most recent call last):
[Thu Nov 18 07:17:10 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/controllers/account.py", line 120, in verify
[Thu Nov 18 07:17:10 2010] [error]     user = auth.verify()
[Thu Nov 18 07:17:10 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/lib/oauth/base.py", line 145, in verify
[Thu Nov 18 07:17:10 2010] [error]     return self._get_credentials(access_token)
[Thu Nov 18 07:17:10 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/lib/oauth/facebook_.py", line 152, in _get_credentials
[Thu Nov 18 07:17:10 2010] [error]     profile = extract_fb_data(fb_profile)
[Thu Nov 18 07:17:10 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/lib/oauth/facebook_.py", line 82, in extract_fb_data
[Thu Nov 18 07:17:10 2010] [error]     'identifier': 'https://graph.facebook.com/%s' % data['id'],
[Thu Nov 18 07:17:10 2010] [error] KeyError: 'id'

yahoo doesn't like multiple email addresses

Yahoo is giving an error about malformed email addresses when more than one is specified. It doesn't seem to like the comma separated addresses and spaces doesn't work either.

{'status': 500, 'message': 'Malformed "to", "cc" or "bcc" email addresses specified.', 'code': 'Client.InvalidRecipientAddress', 'detail': None, 'provider': 'yahoo.com'}

better error result for cancelling oauth

[Thu Nov 11 07:53:51 2010] [error] Traceback (most recent call last):
[Thu Nov 11 07:53:51 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/controllers/account.py", line 119, in verify
[Thu Nov 11 07:53:51 2010] [error]     user = auth.verify()
[Thu Nov 11 07:53:51 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/lib/oauth/openidconsumer.py", line 324, in verify
[Thu Nov 11 07:53:51 2010] [error]     raise Exception("consumer canceled: "+info.message)
[Thu Nov 11 07:53:51 2010] [error] AttributeError: 'CancelResponse' object has no attribute 'message'

Can't switch dictionaries in the input field

Use case :
I want to twit in french. And I'm a very bad speller (I very often misstype words).
STR :

  1. go to a page
  2. open F1's bar
  3. choose say twitter
  4. Type some french :"ie cette page est vraiment superbe, je la recomande fortement"
  5. Right click in the field to switch dictionnary

Expected results, the usual right click menu show up and I can switch my dictionary, and get rid of all that underlying red.

Results nothing happens. Error console is empty. using 0.7.1 version of the addon with Mozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:2.0b6) Gecko/20100101 Firefox/4.0b6.

server code does not work with the latest migrate package

If you checkout and develop the current trunk, and it will pull migrate-0.6.1, which does not work with the current code.

My diff to make it work:

diff --git a/linkdrop/config/environment.py b/linkdrop/config/environment.py
index da589e6..b168db5 100644
--- a/linkdrop/config/environment.py
+++ b/linkdrop/config/environment.py
@@ -32,7 +32,8 @@ from sqlalchemy import engine_from_config
from paste.deploy.converters import asbool

from migrate.versioning.util import load_model
-from migrate.versioning import exceptions, genmodel, schemadiff, schema
+from migrate.versioning import genmodel, schemadiff, schema
+from migrate import exceptions

import linkdrop.lib.app_globals as app_globals
from linkdrop.config.routing import make_map
@@ -44,7 +45,7 @@ def load_environment(global_conf, app_conf):
object
"""

config = PylonsConfig()

  • Pylons paths

    root = os.path.dirname(os.path.dirname(os.path.abspath(file)))
    paths = dict(root=root,
    @@ -68,7 +69,7 @@ def load_environment(global_conf, app_conf):
 import linkdrop.lib.helpers as h
 config['pylons.h'] = h

    Setup cache object as early as possible

    import pylons
    pylons.cache._push_object(config['pylons.app_globals'].cache)
    @@ -95,9 +96,9 @@ def load_environment(global_conf, app_conf):
    # unmanaged upgrades
    diff = schemadiff.getDiffOfModelAgainstDatabase(
    meta.Base.metadata, engine, excludeTables=None)

  •        genmodel.ModelGenerator(diff).applyModel()
    
  •        genmodel.ModelGenerator(diff, engine).applyModel()
    

    CONFIGURATION OPTIONS HERE (note: all config options will override

    any Pylons config options)

    return config
    diff --git a/setup.py b/setup.py
    index ce859ac..384c8f6 100644
    --- a/setup.py
    +++ b/setup.py
    @@ -37,7 +37,7 @@ setup(
    url='',
    install_requires=[
    "Pylons>=1.0",

  •    "SQLAlchemy>=0.5",
    
  •    "SQLAlchemy==0.6.6",
     "docutils",
     "nose",
     "httplib2",
    

leave the send link option alone

Someone noted in the feedback forums that they use Send Link to send from their local email client. We don't actually have to remove that option so it might make sense to leave it in.

Can't share ftp links

F1 is disabled on ftp://zedz.net/pub/security/cryptography/apps/mail/herbrip/original_post.txt which to me is a very shareable link.

DM UI/UX needs to be fixed

The current direct message UI is confusing, need to implement a drop down of some sort that lets the user know where they are sending their message.

Better email templates

The emails that get sent out are pretty bare-bones, and I suspect we could make them friendlier without making them obnoxious.

use the toolbar button for sharing activity

Currently we overlay the share page with share activity but with the new panel (which takes up more space and is over the page) we should move to a model where the panel removes itself (animates up toward the button) when share is clicked and the share button then animates the sharing progress.

For errors and issues during sharing we can change the button to an error state and pop the panel back down and display a notification bar above the share page with the error information.

F1 start up page and error/success messages are wrong

Need a re-design of the F1 start page that tells you to set up account, as well as creating a consistent UI for error messages and the success messages. At the very least, need to get rid of the transparent backgrounds currently in there.

TypeError: __init__() got an unexpected keyword argument '_warn_on_bytestring'

Followed the instructions on the front page and got this :

$ paster serve --reload development.ini
Starting subprocess with file monitor
Traceback (most recent call last):
File "/home/arthur/local/f1/env/bin/paster", line 9, in
load_entry_point('PasteScript==1.7.3', 'console_scripts', 'paster')()
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteScript-1.7.3-py2.6.egg/paste/script/command.py", line 84, in run
invoke(command, command_name, options, args[1:])
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteScript-1.7.3-py2.6.egg/paste/script/command.py", line 123, in invoke
exit_code = runner.run(args)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteScript-1.7.3-py2.6.egg/paste/script/command.py", line 218, in run
result = self.command()
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteScript-1.7.3-py2.6.egg/paste/script/serve.py", line 276, in command
relative_to=base, global_conf=vars)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteScript-1.7.3-py2.6.egg/paste/script/serve.py", line 313, in loadapp
*_kw)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 204, in loadapp
return loadobj(APP, uri, name=name, *_kw)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 225, in loadobj
return context.create()
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 625, in create
return self.object_type.invoke(self)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 177, in invoke
next_app = context.next_context.create()
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 625, in create
return self.object_type.invoke(self)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 177, in invoke
next_app = context.next_context.create()
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 625, in create
return self.object_type.invoke(self)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 108, in invoke
*_context.local_conf)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/util/fixtypeerror.py", line 57, in fix_call
val = callable(_args, *_kw)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/Paste-1.7.3.1-py2.6.egg/paste/urlmap.py", line 24, in urlmap_factory
app = loader.get_app(app_name, global_conf=global_conf)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 297, in get_app
name=name, global_conf=global_conf).create()
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 309, in app_context
APP, name=name, global_conf=global_conf)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 409, in get_context
section)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 431, in _context_from_use
object_type, name=use, global_conf=global_conf)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 361, in get_context
global_conf=global_conf)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 248, in loadcontext
global_conf=global_conf)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 285, in _loadegg
return loader.get_context(object_type, name, global_conf)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 561, in get_context
object_type, name=name)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py", line 587, in find_egg_entry_point
possible.append((entry.load(), protocol, entry.name))
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/distribute-0.6.10-py2.6.egg/pkg_resources.py", line 1948, in load
entry = import(self.module_name, globals(),globals(), ['name'])
File "/home/arthur/local/f1/linkdrop/config/middleware.py", line 34, in
from linkdrop.config.environment import load_environment
File "/home/arthur/local/f1/linkdrop/config/environment.py", line 38, in
import linkdrop.lib.helpers
File "/home/arthur/local/f1/linkdrop/lib/helpers.py", line 39, in
from linkdrop.model.meta import Session
File "/home/arthur/local/f1/linkdrop/model/init.py", line 26, in
from linkdrop.model.account import Account
File "/home/arthur/local/f1/linkdrop/model/account.py", line 34, in
class Account(JsonExpandoMixin, SerializerMixin, Base):
File "/home/arthur/local/f1/linkdrop/model/account.py", line 40, in Account
key = Column(RDUnicode(64), index=True)
File "/home/arthur/local/f1/linkdrop/model/types.py", line 40, in init
super(RDUnicode, self).init(length=length, *_kwargs)
File "/home/arthur/local/f1/env/lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/types.py", line 549, in init
super(Unicode, self).init(length=length, **kwargs)

better connecting dialog

Karen just had a (re-)connecting dialog that never closed. It looked like it was stuck on the connecting to f1.mozillamessaging.com (according to the status bar) and the page was blank at that moment. Oh how I wish we didn't have these dialogs...

I'm wondering if we do some simple improvements.

  • A simple change would be to add some text to the connecting spinner letting people know they can close the window and try again if it takes too long.
  • Perhaps we could watch the dialog from with in the extension or frame page and offer to try again if it's taking too long.

bump maxVersion to 4.0b9pre

This was already done in code ( 7f4c45d ) but we can just bump up the maxVersion compat inside AMO so F1 continues to work with the latest Minefield nightly. I don't think this even takes an approval.

meta open graph changes

Facebook changed their meta tag requirements to include the og: (open graph) prefix. We'll need to look for this in the add-on if we want to continue getting the correct open graph information from sites that provide it.

facebook developers - share

Let me tag my friends and use auto completion

I would like to be able to tag my friends using @username , I just don't always remember how FB or twiter know my friends. I usually use the proposed auto-completion list to find the proper nickname, would be nice to be able to do that in F1 too.

improve the email shared message notification

For email accounts we use the same "Shared $DOMAIN with $X" which is a bit awkward when $X is Google Apps, Yahoo Mail, or Gmail. We should have a more specific share notification for these types of "sent to" services.

Sent $DOMAIN link to $RECIPIENTS

For email we might need to cap the recipients size even though people aren't likely sending out to lots of people.

This might actually work for all types of shares if we phrased the more broadcast like services as recipients.

e.g. for Twitter
Sent www.yahoo.com link to your twitter followers

e.g. for Facebook
Sent www.yahoo.com link to your wall

Which would then adapt much better when we add recipients in Facebook

fix logging of a redirect

[Thu Nov 11 06:50:11 2010] [error] Traceback (most recent call last):
[Thu Nov 11 06:50:11 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/controllers/account.py", line 119, in verify
[Thu Nov 11 06:50:11 2010] [error]     user = auth.verify()
[Thu Nov 11 06:50:11 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/lib/oauth/openidconsumer.py", line 324, in verify
[Thu Nov 11 06:50:11 2010] [error]     raise Exception("consumer canceled: "+info.message)
[Thu Nov 11 06:50:11 2010] [error] AttributeError: 'CancelResponse' object has no attribute 'message'
[Thu Nov 11 06:52:59 2010] [error] No handlers could be found for logger "linkdrop.lib.helpers"
[Thu Nov 11 06:54:21 2010] [error] Traceback (most recent call last):
[Thu Nov 11 06:54:21 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/controllers/account.py", line 119, in verify
[Thu Nov 11 06:54:21 2010] [error]     user = auth.verify()
[Thu Nov 11 06:54:21 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/lib/oauth/base.py", line 85, in verify
[Thu Nov 11 06:54:21 2010] [error]     redirect(session.get('end_point_auth_failure',self.config.get('oauth_failure')))
[Thu Nov 11 06:54:21 2010] [error]   File "/home/linkdrop/linkdrop-env/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/controllers/util.py", line 208, in redirect
[Thu Nov 11 06:54:21 2010] [error]     raise exc(location=url).exception
[Thu Nov 11 06:54:21 2010] [error] HTTPFound: 302 Found
[Thu Nov 11 06:54:21 2010] [error] Content-Type: text/html; charset=UTF-8
[Thu Nov 11 06:54:21 2010] [error] Content-Length: 0
[Thu Nov 11 06:54:21 2010] [error] Location: /auth.html#oauth_failure

noscript breaks f1

a report from facebook:

Just a quick report, which you might have heard before. Noscript stops your application from working. I.e unless i allow mozillamessaging in no script app refuses to work. and since its not really on page. so users dont even get msg that mozillamessaging is being blocked.

server not available failure

if the server is not available when you load the panel, you get an error page from the server. there is no way to reload the panel so you are stuck and have to restart firefox to get the panel to reload.

latest email auto completion isn't visible

As you choose emails in the "to" field from the auto-complete the last selected email isn't scrolled into focus which makes it difficult to see if the correct email address has been chosen. We might need a simple setSelectionRange(input.length,input.length) after we auto complete to ensure that the text field has scrolled to the correct location.

f1 thinks it goofed up when service returns a 'normal' error.

Share something via twitter, then share the exact same thing again. Twitter responds with a 'status is a duplicate' error, but F1 renders 'We're really sorry, F1 done goofed up. Status is a duplicate.' and an ERROR record is logged. This should probably be handled slightly more gracefully, telling the user it was twitter which failed rather than f1, and probably with just an INFO log record.

(Note: I see this when testing the share page directly - you should get the same error using it "for real", assuming we get back the same shortened URL the second time.)

improve the account tooltips

the tooltips for accounts in the share page hover over the to entry for email systems and because they are click targets for changing account can cause inadvertant switches.

We either need to move the tooltips to a different location or make then non-click targets so they don't take you to that page with accidentally clicked.

no auth code received

[Thu Nov 11 05:41:06 2010] [error] Traceback (most recent call last):
[Thu Nov 11 05:41:06 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/controllers/account.py", line 119, in verify
[Thu Nov 11 05:41:06 2010] [error]     user = auth.verify()
[Thu Nov 11 05:41:06 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/lib/oauth/base.py", line 119, in verify
[Thu Nov 11 05:41:06 2010] [error]     raise Exception("No oauth code received")
[Thu Nov 11 05:41:06 2010] [error] Exception: No oauth code received

some twitter errors do not return json

[Thu Nov 11 06:25:01 2010] [error] Traceback (most recent call last):
[Thu Nov 11 06:25:01 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/controllers/send.py", line 116, in send
[Thu Nov 11 06:25:01 2010] [error]     result, error = provider.api(acct).sendmessage(message, args)
[Thu Nov 11 06:25:01 2010] [error]   File "/home/linkdrop/linkdrop/linkdrop/lib/oauth/twitter_.py", line 162, in sendmessage
[Thu Nov 11 06:25:01 2010] [error]     details = json.load(exc.e)
[Thu Nov 11 06:25:01 2010] [error]   File "/usr/lib64/python2.6/json/__init__.py", line 267, in load
[Thu Nov 11 06:25:01 2010] [error]     parse_constant=parse_constant, **kw)
[Thu Nov 11 06:25:01 2010] [error]   File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads
[Thu Nov 11 06:25:01 2010] [error]     return _default_decoder.decode(s)
[Thu Nov 11 06:25:01 2010] [error]   File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode
[Thu Nov 11 06:25:01 2010] [error]     obj, end = self.raw_decode(s, idx=_w(s, 0).end())
[Thu Nov 11 06:25:01 2010] [error]   File "/usr/lib64/python2.6/json/decoder.py", line 338, in raw_decode
[Thu Nov 11 06:25:01 2010] [error]     raise ValueError("No JSON object could be decoded")
[Thu Nov 11 06:25:01 2010] [error] ValueError: No JSON object could be decoded

Panel height

Share UI needs to have a flexible height to take up the correct amount of space for the given number of connected accounts, currently it only accommodates 3 accounts correctly. We need to make sure the Panel can stretch with the share UI.

Use our own URL shortener

wouldn't it be nice to use a specific redirector, something like f1.ly for instance. Would allow us to have some nice stats usage etc ....

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.