code:
<?php
/*
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2010, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

if (!defined('STATUSNET') && !defined('LACONICA')) {
    exit(1);
}

class User_urlshortener_prefs extends Managed_DataObject
{
    ###START_AUTOCODE
    /* the code below is auto generated do not remove the above tag */

    public $__table = 'user_urlshortener_prefs';         // table name
    public $user_id;                         // int(4)  primary_key not_null
    public $urlshorteningservice;            // varchar(50)   default_ur1.ca
    public $maxurllength;                    // int(4)   not_null
    public $maxnoticelength;                 // int(4)   not_null
    public $created;                         // datetime   not_null default_0000-00-00%2000%3A00%3A00
    public $modified;                        // timestamp   not_null default_CURRENT_TIMESTAMP

    /* the code above is auto generated do not remove the tag below */
    ###END_AUTOCODE

    public static function schemaDef()
    {
        return array(
            'fields' => array(
                'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user'),
                'urlshorteningservice' => array('type' => 'varchar', 'length' => 50, 'default' => 'internal', 'description' => 'service to use for auto-shortening URLs'),
                'maxurllength' => array('type' => 'int', 'not null' => true, 'description' => 'urls greater than this length will be shortened, 0 = always, null = never'),
                'maxnoticelength' => array('type' => 'int', 'not null' => true, 'description' => 'notices with content greater than this value will have all urls shortened, 0 = always, -1 = only if notice text is longer than max allowed'),

                'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
                'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
            ),
            'primary key' => array('user_id'),
            'foreign keys' => array(
                'user_urlshortener_prefs_user_id_fkey' => array('user', array('user_id' => 'id')),
            ),
        );
    }

    static function maxUrlLength($user)
    {
        $def = common_config('url', 'maxurllength');

        $prefs = self::getPrefs($user);

        if (empty($prefs)) {
            return $def;
        } else {
            return $prefs->maxurllength;
        }
    }

    static function maxNoticeLength($user)
    {
        $def = common_config('url', 'maxnoticelength');

        if ($def == -1) {
            /*
             * maxContent==0 means infinite length,
             * but maxNoticeLength==0 means "always shorten"
             * so if maxContent==0 we must set this to -1
             */
            $def = Notice::maxContent() ?: -1;
        }

        $prefs = self::getPrefs($user);

        if (empty($prefs)) {
            return $def;
        } else {
            return $prefs->maxnoticelength;
        }
    }

    static function urlShorteningService($user)
    {
        $def = common_config('url', 'shortener');

        $prefs = self::getPrefs($user);

        if (empty($prefs)) {
            if (!empty($user)) {
                return $user->urlshorteningservice;
            } else {
                return $def;
            }
        } else {
            return $prefs->urlshorteningservice;
        }
    }

    static function getPrefs($user)
    {
        if (empty($user)) {
            return null;
        }

        $prefs = User_urlshortener_prefs::getKV('user_id', $user->id);

        return $prefs;
    }
}


code:
<?php
/**
 * Table Definition for user_username
 */
require_once INSTALLDIR.'/classes/Memcached_DataObject.php';

class User_username extends Managed_DataObject
{
    ###START_AUTOCODE
    /* the code below is auto generated do not remove the above tag */

    public $__table = 'user_username';                     // table name
    public $user_id;                        // int(4)  not_null
    public $provider_name;                  // varchar(191)  primary_key not_null   not 255 because utf8mb4 takes more space
    public $username;                       // varchar(191)  primary_key not_null   not 255 because utf8mb4 takes more space
    public $created;                        // datetime()   not_null
    public $modified;                       // timestamp()   not_null default_CURRENT_TIMESTAMP

    /* the code above is auto generated do not remove the tag below */
    ###END_AUTOCODE

    public static function schemaDef()
    {
        return array(
            'fields' => array(
                'provider_name' => array('type' => 'varchar', 'length' => 191, 'description' => 'provider name'),
                'username' => array('type' => 'varchar', 'length' => 191, 'description' => 'username'),
                'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice id this title relates to'),
                'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
                'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
            ),
            'primary key' => array('provider_name', 'username'),
            'indexes' => array(
                'user_id_idx' => array('user_id')
            ),
            'foreign keys' => array(
                'user_username_user_id_fkey' => array('user', array('user_id' => 'id')),
            ),
        );
    }

    /**
    * Register a user with a username on a given provider
    * @param User User object
    * @param string username on the given provider
    * @param provider_name string name of the provider
    * @return mixed User_username instance if the registration succeeded, false if it did not
    */
    static function register($user, $username, $provider_name)
    {
        $user_username = new User_username();
        $user_username->user_id = $user->id;
        $user_username->provider_name = $provider_name;
        $user_username->username = $username;
        $user_username->created = common_sql_now();

        if($user_username->insert()){
            return $user_username;
        }else{
            return false;
        }
    }
}

repo_name: andremichelle/gnu

license: mit


code:
[status_network]
site_id = 129
nickname = 130
hostname = 2
pathname = 2
dbhost = 2
dbuser = 2
dbpass = 2
dbname = 2
sitename = 2
theme = 2
logo = 2
created = 142
modified = 384

[status_network__keys]
site_id  = K
nickname = U
hostname = U
pathname = U

[status_network_tag]
site_id = 129
tag = 130
created = 142

[status_network_tag__keys]
site_id = K
tag = K


gnusocial/gnusocial

description: Free software social networking platform.

type: project

minimum-stability: dev

preferred-install: dist


_readme: This file locks the dependencies of your project to a known state

_readme: Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies

apereo/phpcas

type: git

type: zip

type: library

description: Provides a simple API for authenticating users against a CAS server

keywords: apereo cas jasig

diogocomposer/xmpphp

XMPPHP\: XMPPHP

description: XMPP PHP Library

keywords: jabber xmpp xmpphp

ezyang/htmlpurifier

HTMLPurifier: library/

description: Standards compliant HTML filter written in PHP

hoa/consistency

description: The Hoa\Consistency library.

keywords: autoloader callable consistency entity flex keyword library

hoa/event

description: The Hoa\Event library.

keywords: event library listener observer

hoa/exception

description: The Hoa\Exception library.

keywords: exception library

Masterminds\: src

description: An HTML5 parser and serializer.

keywords: HTML5 dom html parser querypath serializer xml

barnabywalters/mf-cleaner: To more easily handle the canonical data php-mf2 gives you

masterminds/html5: Alternative HTML parser for PHP, for better HTML5 support.

description: A pure, generic microformats2 parser — makes HTML as easy to consume as a JSON API

keywords:
html
microformats
microformats 2
parser
semantic

michelf/php-markdown

Michelf\: Michelf/

Michel Fortin

role: Developer

description: PHP Markdown

openid/php-openid

description: OpenID library for PHP5

keywords: Authentication OpenId auth yadis

ParagonIE\ConstantTime\: src/

Paragon Initiative Enterprises

role: Maintainer

Steve 'Sc00bz' Thomas

role: Original Developer

description: Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)

ext-libsodium: Provides a modern crypto API that can be used to generate random bytes.

description: PHP 5.x polyfill for random_bytes() and random_int() from PHP 7

keywords: csprng polyfill pseudorandom random

phpseclib/phpseclib

version: dev-master

ext-gmp: Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.

ext-libsodium: SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.

ext-mcrypt: Install the Mcrypt extension in order to speed up a few other cryptographic operations.

ext-openssl: Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations.

phpseclib\: phpseclib/

Jim Wigginton

role: Lead Developer

description: PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.

keywords: BigInteger aes asn.1 asn1 blowfish crypto cryptography encryption rsa security sftp signature signing ssh twofish x.509 x509

stomp-php/stomp-php

Stomp\: src/

description: stomp support for PHP

keywords: activeMQ apollomq jms messaging rabbitmq stomp

cilex/cilex

Cilex: src/

description: The PHP micro-framework for Command line tools based on the Symfony2 Components

keywords: cli microframework

cilex/console-service-provider

Cilex\Provider\Console: src

description: Console Service Provider

keywords: cilex console pimple service-provider silex

container-interop/container-interop

Interop\Container\: src/Interop/Container/

description: Promoting the interoperability of container objects (DIC, SL, etc.)

dnoegel/php-xdg-base-dir

XdgBaseDir\: src/

description: implementation of xdg base directory specification for php

doctrine/annotations

Doctrine\Common\Annotations\: lib/Doctrine/Common/Annotations

description: Docblock Annotations Parser

keywords: annotations docblock parser

doctrine/instantiator

Doctrine\Instantiator\: src/Doctrine/Instantiator/

description: A small, lightweight utility to instantiate objects in PHP without invoking their constructors

keywords: constructor instantiate

doctrine/lexer

Doctrine\Common\Lexer\: lib/Doctrine/Common/Lexer

description: PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.

keywords: annotations docblock lexer parser php

erusev/parsedown

description: Parser for Markdown.

keywords: markdown parser

herrera-io/json

description: A library for simplifying JSON linting and validation.

herrera-io/phar-update

description: A library for self-updating Phars.

hoa/compiler

description: The Hoa\Compiler library.

keywords: algebraic ast compiler context-free coverage exhaustive grammar isotropic language lexer library ll1 llk parser pp random regular rule sampler syntax token trace uniform

hoa/file

description: The Hoa\File library.

keywords: Socket directory file finder library link temporary

hoa/iterator

description: The Hoa\Iterator library.

hoa/math

description: The Hoa\Math library.

keywords: arrangement combination combinatorics counting library math permutation sampler set

hoa/protocol

description: The Hoa\Protocol library.

keywords: library protocol resource stream wrapper

hoa/regex

description: The Hoa\Regex library.

hoa/stream

description: The Hoa\Stream library.

keywords: Context bucket composite filter in library out protocol stream wrapper

hoa/ustring

ext-iconv: ext/iconv must be present (or a third implementation) to use Hoa\Ustring::transcode().

ext-intl: To get a better Hoa\Ustring::toAscii() and Hoa\Ustring::compareTo().

description: The Hoa\Ustring library.

hoa/visitor

description: The Hoa\Visitor library.

hoa/zformat

description: The Hoa\Zformat library.

jakub-onderka/php-console-highlighter

description: Highlight PHP code in terminal

jms/metadata

description: Class/method/property metadata management in PHP

jms/serializer

doctrine/cache: Required if you like to use cache functionality.

doctrine/collections: Required if you like to use doctrine collection types as ArrayCollection.

symfony/yaml: Required if you'd like to use the YAML metadata format.

description: Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.

keywords: deserialization jaxb json serialization xml

justinrainbow/json-schema

description: A library to validate a json schema.

kherge/version

description: A parsing and comparison library for semantic versioning.

monolog/monolog

aws/aws-sdk-php: Allow sending log messages to AWS services like DynamoDB

doctrine/couchdb: Allow sending log messages to a CouchDB server

ext-amqp: Allow sending log messages to an AMQP server (1.0+ required)

ext-mongo: Allow sending log messages to a MongoDB server

graylog2/gelf-php: Allow sending log messages to a GrayLog2 server

mongodb/mongodb: Allow sending log messages to a MongoDB server via PHP Driver

php-amqplib/php-amqplib: Allow sending log messages to an AMQP server using php-amqplib

php-console/php-console: Allow sending log messages to Google Chrome

ruflin/elastica: Allow sending log messages to an Elastic Search server

sentry/sentry: Allow sending log messages to a Sentry server

description: Sends your logs to files, sockets, inboxes, databases and various web services

myclabs/deep-copy

description: Create deep copies (clones) of your objects

keywords:
clone
copy
duplicate
object
object graph

nikic/php-parser

description: A PHP parser written in PHP

phar-io/manifest

description: Component for reading phar.io manifest information from a PHP Archive (PHAR)

phar-io/version

description: Library for handling version information and constraints

phpdocumentor/fileset

description: Fileset component for collecting a set of files given directories and file paths

phpdocumentor/phpdocumentor

ext-twig: Enabling the twig extension improves the generation of twig based templates.

ext-xslcache: Enabling the XSLCache extension improves the generation of xml based templates.

description: Documentation Generator for PHP

keywords: api application dga documentation phpdoc

phpdocumentor/reflection

description: Reflection library to do Static Analysis for PHP Projects

keywords:
phpDocumentor
phpdoc
reflection
static analysis

phpspec/prophecy

description: Highly opinionated mocking framework for PHP 5.3+

phpunit/php-code-coverage

description: Library that provides collection, processing, and rendering functionality for PHP code coverage information.

phpunit/php-file-iterator

description: FilterIterator implementation that filters files based on a list of suffixes.

phpunit/php-text-template

description: Simple template engine.

phpunit/php-timer

description: Utility class for timing

phpunit/php-token-stream

description: Wrapper around PHP's tokenizer extension.

phpunit/phpunit

description: The PHP Unit Testing framework.

pimple/pimple

description: Pimple is a simple Dependency Injection Container for PHP 5.3

psr/cache

description: Common interface for caching libraries

psr/container

description: Common Container Interface (PHP FIG PSR-11)

keywords: PSR-11 container container-interface container-interop psr

psr/log

description: Common interface for logging libraries

psr/simple-cache

description: Common interfaces for simple caching

psy/psysh

ext-pcntl: Enabling the PCNTL extension makes PsySH a lot happier :)

ext-pdo-sqlite: The doc command requires SQLite to work.

ext-posix: If you have PCNTL, you'll want the POSIX extension as well.

ext-readline: Enables support for arrow-key history navigation, and showing and manipulating command history.

hoa/console: A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit.

description: An interactive shell for modern PHP.

sebastian/code-unit-reverse-lookup

description: Looks up which function or method a line of code belongs to

sebastian/comparator

description: Provides the functionality to compare PHP values for equality

sebastian/diff

description: Diff implementation

sebastian/environment

description: Provides functionality to handle HHVM/PHP environments

sebastian/exporter

description: Provides the functionality to export PHP variables for visualization

sebastian/global-state

description: Snapshotting of global state

sebastian/object-enumerator

description: Traverses array structures and object graphs to enumerate all referenced objects

sebastian/object-reflector

description: Allows reflection of object attributes, including inherited and non-public ones

sebastian/recursion-context

description: Provides functionality to recursively process PHP variables

sebastian/resource-operations

description: Provides a list of PHP built-in functions that operate on resources

sebastian/type

description: Collection of value objects that represent the types of the PHP type system

sebastian/version

description: Library that helps with managing the version number of Git-hosted PHP projects

seld/jsonlint

description: JSON Linter

symfony/config

description: Symfony Config Component

symfony/console

description: Symfony Console Component

symfony/debug

description: Symfony Debug Component

symfony/event-dispatcher

description: Symfony EventDispatcher Component

symfony/filesystem

description: Symfony Filesystem Component

symfony/finder

description: Symfony Finder Component

symfony/polyfill-ctype

description: Symfony polyfill for ctype functions

symfony/polyfill-mbstring

description: Symfony polyfill for the Mbstring extension

keywords: compatibility mbstring polyfill portable shim

description: Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions

symfony/process

description: Symfony Process Component

symfony/stopwatch

description: Symfony Stopwatch Component

symfony/translation

description: Symfony Translation Component

symfony/validator

doctrine/annotations: For using the annotation mapping. You will also need doctrine/cache.

doctrine/cache: For using the default cached annotation reader and metadata cache.

description: Symfony Validator Component

symfony/var-dumper

ext-iconv: To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).

description: Symfony mechanism for exploring and dumping PHP variables

theseer/tokenizer

description: A small library for converting tokenized PHP source code into XML and potentially other formats

twig/twig

description: Twig, the flexible, fast, and secure template language for PHP

zendframework/zend-cache

ext-apc: APC or compatible extension, to use the APC storage adapter

ext-apcu: APCU >= 5.1.0, to use the APCu storage adapter

ext-memcache: Memcache >= 2.0.0 to use the Memcache storage adapter

ext-memcached: Memcached >= 1.0.0 to use the Memcached storage adapter

ext-mongodb: MongoDB, to use the ExtMongoDb storage adapter

ext-wincache: WinCache, to use the WinCache storage adapter

ext-xcache: XCache, to use the XCache storage adapter

mongodb/mongodb: Required for use with the ext-mongodb adapter

mongofill/mongofill: Alternative to ext-mongo - a pure PHP implementation designed as a drop in replacement

description: Caching implementation with a variety of storage options, as well as codified caching strategies for callbacks, classes, and output

zendframework/zend-config

zendframework/zend-json: Zend\Json to use the Json reader or writer classes

zendframework/zend-servicemanager: Zend\ServiceManager for use with the Config Factory to retrieve reader and writer instances

description: provides a nested object property based user interface for accessing this configuration data within application code

zendframework/zend-eventmanager

container-interop/container-interop: ^1.1.0, to use the lazy listeners feature

zendframework/zend-stdlib: ^2.7.3 || ^3.0, to use the FilterChain feature

description: Trigger and listen to events within a PHP application

zendframework/zend-filter

psr/http-factory-implementation: psr/http-factory-implementation, for creating file upload instances when consuming PSR-7 in file upload filters

zendframework/zend-crypt: Zend\Crypt component, for encryption filters

zendframework/zend-i18n: Zend\I18n component for filters depending on i18n functionality

zendframework/zend-servicemanager: Zend\ServiceManager component, for using the filter chain functionality

zendframework/zend-uri: Zend\Uri component, for the UriNormalize filter

description: provides a set of commonly needed data filters

zendframework/zend-hydrator

zendframework/zend-eventmanager: ^2.6.2 || ^3.0, to support aggregate hydrator usage

zendframework/zend-filter: ^2.6, to support naming strategy hydrator usage

zendframework/zend-servicemanager: ^2.7.5 || ^3.0.3, to support hydrator plugin manager usage

ext-intl: Required for most features of Zend\I18n; included in default builds of PHP

zendframework/zend-eventmanager: You should install this package to use the events in the translator

zendframework/zend-filter: You should install this package to use the provided filters

zendframework/zend-validator: You should install this package to use the provided validators

zendframework/zend-view: You should install this package to use the provided view helpers

description: Provide translations for your application, and filter and validate internationalized values

zendframework/zend-json

description: provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP

zendframework/zend-serializer

zendframework/zend-math: (^2.6 || ^3.0) To support Python Pickle serialization

zendframework/zend-servicemanager: (^2.7.5 || ^3.0.3) To support plugin manager support

description: provides an adapter based interface to simply generate storable representation of PHP types by different facilities, and recover

zendframework/zend-servicemanager

ocramius/proxy-manager: ProxyManager 0.5.* to handle lazy initialization of services

zendframework/zend-stdlib

zendframework/zend-filter: To support naming strategy hydrator usage

zendframework/zend-servicemanager: To support hydrator plugin manager usage

zetacomponents/base

description: The Base package provides the basic infrastructure that all packages rely on. Therefore every component relies on this package.

zetacomponents/document

description: The Document components provides a general conversion framework for different semantic document markup languages like XHTML, Docbook, RST and similar.


code:
<?php

/**
 *
 * Some notes...
 *
 * Drupal docs don't list a bool type, but it might be nice to use rather than 'tinyint'
 * Note however that we use bitfields and things as well in tinyints, and PG's
 * "bool" type isn't 100% compatible with 0/1 checks. Just keeping tinyints. :)
 *
 * decimal <-> numeric
 *
 * MySQL 'timestamp' columns were formerly used for 'modified' files for their
 * auto-updating properties. This didn't play well with changes to cache usage
 * in 0.9.x, as we don't know the timestamp value at INSERT time and never
 * have a chance to load it up again before caching. For now I'm leaving them
 * in, but we may want to clean them up later.
 *
 * Current code should be setting 'created' and 'modified' fields explicitly;
 * this also avoids mismatches between server and client timezone settings.
 *
 *
 * fulltext indexes?
 * got one or two things wanting a custom charset setting on a field?
 *
 * foreign keys are kinda funky...
 *     those specified in inline syntax (as all in the original .sql) are NEVER ENFORCED on mysql
 *     those made with an explicit 'foreign key' WITHIN INNODB and IF there's a proper index, do get enforced
 *     double-check what we've been doing on postgres?
 */

$classes = array('Schema_version',
                 'Profile',
                 'Avatar',
                 'Sms_carrier',
                 'User',
                 'Subscription',
                 'Group_join_queue',
                 'Subscription_queue',
                 'Oauth_token_association',
                 'Notice',
                 'Notice_location',
                 'Notice_source',
                 'Notice_prefs',
                 'Reply',
                 'Consumer',
                 'Token',
                 'Nonce',
                 'Oauth_application',
                 'Oauth_application_user',
                 'Confirm_address',
                 'Remember_me',
                 'Queue_item',
                 'Notice_tag',
                 'Foreign_service',
                 'Foreign_user',
                 'Foreign_link',
                 'Foreign_subscription',
                 'Invitation',
                 'Profile_prefs',
                 'Profile_tag',
                 'Profile_list',
                 'Profile_tag_subscription',
                 'Profile_block',
                 'User_group',
                 'Related_group',
                 'Group_inbox',
                 'Group_member',
                 'File',
                 'File_redirection',
                 'File_thumbnail',
                 'File_to_post',
                 'Group_block',
                 'Group_alias',
                 'Session',
                 'Config',
                 'Profile_role',
                 'Location_namespace',
                 'Login_token',
                 'User_location_prefs',
                 'User_im_prefs',
                 'Conversation',
                 'Local_group',
                 'User_urlshortener_prefs',
                 'Old_school_prefs',
                 'User_username',
                 'Attention',
);

foreach ($classes as $cls) {
    $schema[strtolower($cls)] = call_user_func(array($cls, 'schemaDef'));
}


code:
insert into foreign_service
    (id, name, description, created)
values
    ('1','Twitter', 'Twitter Micro-blogging service', now()),
    ('2','Facebook', 'Facebook', now()),
    ('3','FacebookConnect', 'Facebook Connect', now());


code:
insert into location_namespace
    (id, description, created)
values
    (1, 'Geonames', now()),
    (2, 'Where on Earth', now());


code:
INSERT INTO notice_source
    (code, name, url, created)
VALUES
    ('adium', 'Adium', 'http://www.adiumx.com/', now()),
    ('Afficheur', 'Afficheur', 'http://afficheur.sourceforge.jp/', now()),
    ('AgentSolo.com','AgentSolo.com','http://www.agentsolo.com/', now()),
    ('anyio', 'Any.IO', 'http://any.io/', now()),
    ('betwittered','BeTwittered','http://www.32hours.com/betwitteredinfo/', now()),
    ('bti','bti','http://gregkh.github.com/bti/', now()),
    ('choqok', 'Choqok', 'http://choqok.gnufolks.org/', now()),
    ('cliqset', 'Cliqset', 'http://www.cliqset.com/', now()),
    ('DarterosStatus', 'Darteros Status', 'http://www.darteros.com/doc/Darteros_Status', now()),
    ('deskbar','Deskbar-Applet','http://www.gnome.org/projects/deskbar-applet/', now()),
    ('Do','Gnome Do','http://do.davebsd.com/wiki/index.php?title=Microblog_Plugin', now()),
    ('drupal','Drupal','http://drupal.org/', now()),
    ('eventbox','EventBox','http://thecosmicmachine.com/eventbox/', now()),
    ('identica-mode','Emacs Identica-mode','http://nongnu.org/identica-mode/', now()),
    ('Facebook','Facebook','http://apps.facebook.com/identica/', now()),
    ('feed2omb','feed2omb','http://projects.ciarang.com/p/feed2omb/', now()),
    ('get2gnow', 'get2gnow', 'http://uberchicgeekchick.com/?projects=get2gnow', now()),
    ('gNewBook', 'gNewBook', 'http://www.gnewbook.org/', now()),
    ('gravity', 'Gravity', 'http://mobileways.de/gravity', now()),
    ('Gwibber','Gwibber','http://launchpad.net/gwibber', now()),
    ('HelloTxt','HelloTxt','http://hellotxt.com/', now()),
    ('identicatools','Laconica Tools','http://bitbucketlabs.net/laconica-tools/', now()),
    ('identichat','identichat','http://identichat.prosody.im/', now()),
    ('IdentiCurse','IdentiCurse','http://identicurse.net/', now()),
    ('IdentiFox','IdentiFox','http://www.bitbucket.org/uncryptic/identifox/', now()),
    ('identitwitch','IdentiTwitch','http://richfish.org/identitwitch/', now()),
    ('Jiminy','Jiminy','', now()),
    ('LaTwit','LaTwit','http://latwit.mac65.com/', now()),
    ('LiveTweeter', 'LiveTweeter', 'http://addons.songbirdnest.com/addon/1204', now()),
    ('livetweeter', 'livetweeter', 'http://addons.songbirdnest.com/addon/1204', now()),
    ('maisha', 'Maisha', 'http://maisha.grango.org/', now()),
    ('mbpidgin','mbpidgin','', now()),
    ('Mobidentica', 'Mobidentica', 'http://www.substanceofcode.com/software/mobidentica/', now()),
    ('moconica','Moconica','http://moconica.com/', now()),
    ('mustard', 'mustard', 'http://mustard.macno.org', now()),
    ('nambu','Nambu','http://www.nambu.com/', now()),
    ('peoplebrowsr', 'PeopleBrowsr', 'http://www.peoplebrowsr.com/', now()),
    ('Pikchur','Pikchur','http://www.pikchur.com/', now()),
    ('Ping.fm','Ping.fm','http://ping.fm/', now()),
    ('pingvine','PingVine','http://pingvine.com/', now()),
    ('pocketwit','PockeTwit','', now()),
    ('posty','Posty','http://spreadingfunkyness.com/posty/', now()),
    ('qtwitter','qTwitter','http://qtwitter.ayoy.net/', now()),
    ('qwit', 'Qwit', '', now()),
    ('royalewithcheese','Royale With Cheese','http://p.hellyeah.org/', now()),
    ('rssdent','rssdent','http://github.com/zcopley/rssdent/tree/master', now()),
    ('rygh.no','rygh.no','http://rygh.no/', now()),
    ('ryghsms','ryghsms','http://sms.rygh.no/', now()),
    ('smob','SMOB','http://smob.sioc-project.org/', now()),
    ('socialoomphBfD4pMqz31', 'SocialOomph', 'http://www.socialoomph.com/', now()),
    ('spaz','Spaz','http://funkatron.com/spaz', now()),
    ('StatusNet Desktop', 'StatusNet Desktop', 'http://status.net/desktop', now()),
    ('StatusNet Mobile', 'StatusNet Mobile', 'http://status.net/mobile', now()),
    ('StatusNet iPhone', 'iPhone', 'http://status.net/iphone', now()),
    ('StatusNet Android', 'Android', 'http://status.net/android', now()),
    ('StatusNet Blackberry', 'Blackberry', 'http://status.net/blackberry', now()),
    ('tarpipe','tarpipe','http://tarpipe.com/', now()),
    ('tjunar','Tjunar','http://nederflash.nl/boek/titels/tjunar-air', now()),
    ('tr.im','tr.im','http://tr.im/', now()),
    ('triklepost', 'Tricklepost', 'http://github.com/zcopley/tricklepost/tree/master', now()),
    ('tweenky','Tweenky','http://beta.tweenky.com/', now()),
    ('TweetDeck', 'TweetDeck', 'http://www.tweetdeck.com/', now()),
    ('twhirl','Twhirl','http://www.twhirl.org/', now()),
    ('twibble','twibble','http://www.twibble.de/', now()),
    ('Twidge','Twidge','http://software.complete.org/twidge', now()),
    ('twidge','Twidge','http://software.complete.org/twidge', now()),
    ('twidroid','twidroid','http://www.twidroid.com/', now()),
    ('twittelator','Twittelator','http://www.stone.com/iPhone/Twittelator/', now()),
    ('twitter','Twitter','http://twitter.com/', now()),
    ('twitterfeed','twitterfeed','http://twitterfeed.com/', now()),
    ('twitterphoto','TwitterPhoto','http://richfish.org/twitterphoto/', now()),
    ('twitterpm','Net::Twitter','http://search.cpan.org/dist/Net-Twitter/', now()),
    ('twittertools','Twitter Tools','http://wordpress.org/extend/plugins/twitter-tools/', now()),
    ('twitux','Twitux','http://live.gnome.org/DanielMorales/Twitux', now()),
    ('twitvim','TwitVim','http://vim.sourceforge.net/scripts/script.php?script_id=2204', now()),
    ('Updating.Me','Updating.Me','http://updating.me/', now()),
    ('urfastr','urfastr','http://urfastr.net/', now()),
    ('yatca','Yatca','http://www.yatca.com/', now()),
    ('rss.me', 'rss.me', 'http://rss.me/', now());


code:
/* For managing multiple sites */

create table status_network (

    site_id  integer auto_increment primary key comment 'unique id',
    nickname varchar(64)  unique key comment 'nickname',
    hostname varchar(255) unique key comment 'alternate hostname if any',
    pathname varchar(255) unique key comment 'alternate pathname if any',

    dbhost varchar(255) comment 'database host',
    dbuser varchar(255) comment 'database username',
    dbpass varchar(255) comment 'database password',
    dbname varchar(255) comment 'database name',

    sitename varchar(255) comment 'display name',
    theme varchar(255) comment 'theme name',
    logo varchar(255) comment 'site logo',

    tags text comment 'site meta-info tags (pipe-separated)',

    created datetime not null comment 'date this record was created' default now(),
    modified timestamp comment 'date this record was modified' default now()

) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

create table status_network_tag (
    site_id integer  comment 'unique id',
    tag varchar(64) comment 'tag name',
    created datetime not null comment 'date the record was created',

    constraint primary key (site_id, tag),
    index status_network_tag_tag_idx (tag)
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;


code:
INSERT INTO sms_carrier
    (id, name, email_pattern, created)
VALUES
    (100056, '3 River Wireless', '%s@sms.3rivers.net', now()),
    (100057, '7-11 Speakout', '%s@cingularme.com', now()),
    (100058, 'Airtel (Karnataka, India)', '%s@airtelkk.com', now()),
    (100059, 'Alaska Communications Systems', '%s@msg.acsalaska.com', now()),
    (100060, 'Alltel Wireless', '%s@message.alltel.com', now()),
    (100061, 'AT&T Wireless', '%s@txt.att.net', now()),
    (100062, 'Bell Mobility (Canada)', '%s@txt.bell.ca', now()),
    (100063, 'Boost Mobile', '%s@myboostmobile.com', now()),
    (100064, 'Cellular One (Dobson)', '%s@mobile.celloneusa.com', now()),
    (100065, 'Cingular (Postpaid)', '%s@cingularme.com', now()),
    (100066, 'Centennial Wireless', '%s@cwemail.com', now()),
    (100067, 'Cingular (GoPhone prepaid)', '%s@cingularme.com', now()),
    (100068, 'Claro (Nicaragua)', '%s@ideasclaro-ca.com', now()),
    (100069, 'Comcel', '%s@comcel.com.co', now()),
    (100070, 'Cricket', '%s@sms.mycricket.com', now()),
    (100071, 'CTI', '%s@sms.ctimovil.com.ar', now()),
    (100072, 'Emtel (Mauritius)', '%s@emtelworld.net', now()),
    (100073, 'Fido (Canada)', '%s@fido.ca', now()),
    (100074, 'General Communications Inc.', '%s@msg.gci.net', now()),
    (100075, 'Globalstar', '%s@msg.globalstarusa.com', now()),
    (100076, 'Helio', '%s@myhelio.com', now()),
    (100077, 'Illinois Valley Cellular', '%s@ivctext.com', now()),
    (100078, 'i wireless', '%s.iws@iwspcs.net', now()),
    (100079, 'Meteor (Ireland)', '%s@sms.mymeteor.ie', now()),
    (100080, 'Mero Mobile (Nepal)', '%s@sms.spicenepal.com', now()),
    (100081, 'MetroPCS', '%s@mymetropcs.com', now()),
    (100082, 'Movicom', '%s@movimensaje.com.ar', now()),
    (100083, 'Mobitel (Sri Lanka)', '%s@sms.mobitel.lk', now()),
    (100084, 'Movistar (Colombia)', '%s@movistar.com.co', now()),
    (100085, 'MTN (South Africa)', '%s@sms.co.za', now()),
    (100086, 'MTS (Canada)', '%s@text.mtsmobility.com', now()),
    (100087, 'Nextel (Argentina)', '%s@nextel.net.ar', now()),
    (100088, 'Orange (Poland)', '%s@orange.pl', now()),
    (100089, 'Personal (Argentina)', '%s@personal-net.com.ar', now()),
    (100090, 'Plus GSM (Poland)', '%s@text.plusgsm.pl', now()),
    (100091, 'President\'s Choice (Canada)', '%s@txt.bell.ca', now()),
    (100092, 'Qwest', '%s@qwestmp.com', now()),
    (100093, 'Rogers (Canada)', '%s@pcs.rogers.com', now()),
    (100094, 'Sasktel (Canada)', '%s@sms.sasktel.com', now()),
    (100095, 'Setar Mobile email (Aruba)', '%s@mas.aw', now()),
    (100096, 'Solo Mobile', '%s@txt.bell.ca', now()),
    (100097, 'Sprint (PCS)', '%s@messaging.sprintpcs.com', now()),
    (100098, 'Sprint (Nextel)', '%s@page.nextel.com', now()),
    (100099, 'Suncom', '%s@tms.suncom.com', now()),
    (100100, 'T-Mobile', '%s@tmomail.net', now()),
    (100101, 'T-Mobile (Austria)', '%s@sms.t-mobile.at', now()),
    (100102, 'Telus Mobility (Canada)', '%s@msg.telus.com', now()),
    (100103, 'Thumb Cellular', '%s@sms.thumbcellular.com', now()),
    (100104, 'Tigo (Formerly Ola)', '%s@sms.tigo.com.co', now()),
    (100105, 'Unicel', '%s@utext.com', now()),
    (100106, 'US Cellular', '%s@email.uscc.net', now()),
    (100107, 'Verizon', '%s@vtext.com', now()),
    (100108, 'Virgin Mobile (Canada)', '%s@vmobile.ca', now()),
    (100109, 'Virgin Mobile (USA)', '%s@vmobl.com', now()),
    (100110, 'YCC', '%s@sms.ycc.ru', now()),
    (100111, 'Orange (UK)', '%s@orange.net', now()),
    (100112, 'Cincinnati Bell Wireless', '%s@gocbw.com', now()),
    (100113, 'T-Mobile Germany', '%s@t-mobile-sms.de', now()),
    (100114, 'Vodafone Germany', '%s@vodafone-sms.de', now()),
    (100115, 'E-Plus', '%s@smsmail.eplus.de', now()),
    (100116, 'Cellular South', '%s@csouth1.com', now()),
    (100117, 'ChinaMobile (139)', '%s@139.com', now()),
    (100118, 'Dialog Axiata', '%s@dialog.lk', now());


code:
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- https://creativecommons.org/licenses/by/3.0/ for details. -->

%%site.name%% is a
social network based on the Free Software [GNU social](https://git.gnu.io/gnu/gnu-social) tool.

If you [register](%%action.register%%) for an account,
you can post small (%%site.textlimit%% chars or less) text notices
about yourself, where you are, what you're doing, or practically
anything you want. You can also subscribe to the notices of your
friends, or other people you're interested in, and follow them on the
Web or in an [RSS](https://en.wikipedia.org/wiki/RSS) feed.

path: doc-src/about


code:
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- https://creativecommons.org/licenses/by/3.0/ for details. -->

%%site.name%% provides APIs that applications can use to interact with it:

* [AtomPub](atompub)
* [Twitter-compatible API](twitterapi)

## API discovery

The base URLs for the APIs can be obtained using [Really Simple Discovery](https://en.wikipedia.org/wiki/Really_Simple_Discovery).

path: doc-src/api


code:
> The Atom Publishing Protocol (AtomPub) is an application-level
> protocol for publishing and editing Web resources.  The protocol is
> based on HTTP transfer of Atom-formatted representations.  The Atom
> format is documented in the Atom Syndication Format.

You can find more information about AtomPub in [RFC5023](https://tools.ietf.org/html/rfc5023).

> Activity Streams is an open format specification for activity stream protocols,
> which are used to syndicate activities taken in social web applications and
> services.

You can find more information about Activity Streams at [activitystrea.ms](http://activitystrea.ms/).

## Authentication

The API supports both
[HTTP Basic](https://en.wikipedia.org/wiki/Basic_access_authentication)
and [OAuth](https://en.wikipedia.org/wiki/OAuth).

## Service document

The service document for an account is found at
`/api/statusnet/app/service/<nickname>.xml`

Each service document has one workspace ('Main') and four collections:

* **notices**: notices generated by the user
* **subscriptions**: subscriptions by the user
* **favorites**: the user's favorites
* **memberships**: the user's group memberships

Collections are identified by the `<activity:verb>` element(s) in their
`<collection>` element.

## Notices

Notice feeds, in reverse-chronological order, are at
`/api/statuses/user_timeline/<id>.atom`.

This is a partial feed; navigation links are included in the feed to scroll forward
and back.

Notices are represented as Activity Streams events with the "Post" verb and "Note" object-type:

    <entry>
     <activity:object-type>
       http://activitystrea.ms/schema/1.0/note
     </activity:object-type>
     [...]
     <activity:verb>
       http://activitystrea.ms/schema/1.0/post
     </activity:verb>
     [...]
    </entry>

Repeats are be represented as Activity Streams events with the "Share" verb, and with the activity object being an entry representing a Notice:

    <entry>
     <activity:verb>
       http://activitystrea.ms/schema/1.0/share
     </activity:verb>
     [...]
     <activity:object>
      <activity:object-type>
        http://activitystrea.ms/schema/1.0/activity
      </activity:object-type>
      [...]
      <activity:verb>
        http://activitystrea.ms/schema/1.0/post
      </activity:verb>
      [...]
      <activity:object>
       <activity:object-type>
         http://activitystrea.ms/schema/1.0/note
       </activity:object-type>
       [...]
      </activity:object>
      [...]
     </activity:object>
     [...]
    </entry>

Posted files will be represented by the "Post" verb and "Image, File, Video" object-type.

### Single-notice URL

Single notices are be available as an Activity Streams event at `/api/statuses/show/<notice-id>.atom`.

    <entry>
     <activity:object-type>
      http://activitystrea.ms/schema/1.0/note
     </activity:object-type>
     [...]
     <activity:verb>
      http://activitystrea.ms/schema/1.0/post
     </activity:verb>
     <author>
      <activity:object-type>
       http://activitystrea.ms/schema/1.0/person
      </activity:object-type>
      [...]
     </author>
    </entry>

### Posting a notice

A notice can be posted by sending a POST request containing a single `<entry>`
element to the URL of the notice feed. These should have a "Post" verb, and a "Note"
object-type, but since these are the default values, Atom entries that aren't
marked up as Activity Streams objects should be fine to post.

The resulting entry will be returned, per the APP, in Activity Streams format. The
location of the notice can be read from the Content-Location HTTP header of the
result or from the rel=self URL in the resulting entry.

### Editing a notice

Notices cannot be edited. PUT requests to a notice URL will fail.

### Deleting a notice

A single notice can be deleted by posting a DELETE HTTP request to the notice's
Atom representation.

Example with cURL:

    curl -u username:password -X DELETE \
      http://example.org/api/statuses/show/<notice-id>.atom

## Subscriptions

The subscriptions feed, in reverse-chronological order, is at
`/api/statusnet/app/subscriptions/<id>.atom`.

This is a partial feed; it includes the navigation links necessary to scroll forward
and back.

Subscriptions are represented as Activity Streams entries with the "Follow" verb and
"Person" object-type.

### Subscription URL

A subscription has an URL at
`/api/statusnet/app/subscriptions/<subscriber id>/<subscribed id>.atom`.

### Adding a new subscription

To add a new subscription, POST an Activity Streams `<entry>` with a "Follow" verb
and "Person" object-type.

The resulting entry will be returned, per the APP, in Activity Streams format. The
location of the subscription can be read from the Content-Location HTTP header of
the result or from the rel=self URL in the resulting entry.

### Editing a subscription

Subscriptions cannot be edited. PUT requests to the subscription URL will result in
an error.

### Deleting a subscription

To delete a subscription, send a DELETE HTTP request to the Subscription URL.

## Favorites

The feed of the user's favorites, in reverse-chronological order, is at
`/api/statusnet/app/favorites/<user id>.atom`.

This is a partial feed; it includes the navigation links necessary to scroll forward
and back.

Favorites are represented as Activity Streams entries with the "Favorite" verb and
"Note" object-type.

### Favorite URL

Favorite entries have a self URL at
`/api/statusnet/app/favorites/<user id>/<notice id>.atom`.

### Favoriting a notice

To favorite a notice, POST an Activity Streams `<entry>` with the "Favorite" verb and
"Note" object-type.

The resulting favorite will be returned, per the APP, in Activity Streams format.
The location of the favorite can be read from the Content-Location HTTP header of
the result or from the rel=self URL in the resulting entry.

### Editing a favorite

Favorites cannot be edited. PUT requests to a favorite URL will fail.

### Deleting a favorite

To "unfavorite" a notice, POST a DELETE request to the URL for the favorite.

## Groups

A feed of group memberships, in reverse-chron order, is available at
`/api/statusnet/app/memberships/<user id>.atom`.

This is a partial feed; it includes the navigation links necessary to scroll forward
and back.

Memberships are represented as Activity Streams entries with the "Join" ber and
"Group" object-type.

### Membership URL

Each membership has a representation at
`/api/statusnet/app/memberships/<user id>/<group id>.atom`.

### Joining a group

To join a group, POST an activity entry with a "Join" verb and "Group" object-type to
the memberships feed.

The resulting membership will be returned, per the APP, in Activity Streams format.
The location of the membership can be read from the Content-Location HTTP header of
the result or from the rel=self URL in the resulting entry.

### Editing group membership

Group memberships cannot be edited. PUT requests to a membership feed will fail.

### Leaving a group

To leave a group, send a DELETE request to the membership URL.

path: doc-src/atompub


code:
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- https://creativecommons.org/licenses/by/3.0/ for details. -->

There are a number of options for getting in contact with responsible
people for %%site.name%%.

Bugs
----

If you think you've found a bug in the underlying [GNU social](https://gnu.io/social/) software,
or if there's a new feature you'd like to see, add it into the [GNU social task list](https://git.gnu.io/gnu/gnu-social/issues).
Don't forget to check the list of existing bugs to make sure it hasn't already been reported!

Email
-----

You can reach the responsible party for this server at [%%site.email%%](mailto:%%site.email%%).

Post a notice
-------------

If you have a question about how to do something, just post a notice with
your question, preferrably tagged with #NewHere. Watch your inbox for replies.

path: doc-src/contact


code:
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- https://creativecommons.org/licenses/by/3.0/ for details. -->

These are some *Frequently Asked Questions* about this service, with
some answers.

What is this site?
----------------------

This is a social network, running the GNU social software.

You can use it to make connections between friends, family and
colleagues -- writing short notices about yourself, where you are, and
what you're doing, and those notices will be sent to all your contacts.

In the future, we'll be adding support for photo, video and file
sharing, as well as events, better contact management and mobile
devices.

path: doc-src/faq


code:
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- https://creativecommons.org/licenses/by/3.0/ for details. -->

Users on %%site.name%% can create *groups* that other users can join.
Groups can be a great way to share information and entertainment with
a group of people who have a common interest or background; who work
together on a team; or who have a particular knowledge or skill.

You can find out about groups on the server on the
[Groups](%%action.groups%%) page. You can join a group by clicking on
the "Join" button either in the group list or on the group's home page.

Starting a new group
--------------------

You can start a new group for friends and colleagues. Note that all
groups are free for anyone to join.

To start a new group, use the [new group](%%action.newgroup%%) tool
and fill out the form. Describe your group as best you can if you want
people to be able to find it.

When choosing the nickname for your group, try to keep it short. The
nickname is sometimes included in messages to and from the group, so
the less chars the better. Try using acronyms for organizations, or
airport codes for places (like 'pdx' instead of 'portland').

Sending messages to a group
---------------------------

You can send a message to a group using the syntax "!groupname"
anywhere in the message. If you have more than one group named, the
notice will go to each group. Only members can send notices to a
group, and groups do not respond to direct messages (DMs).

You can also select the group from the "To:" drop down when posting.

You can make a group message private by clicking the "private" button
before posting.

Receiving messages
------------------

New group messages will appear in your inbox, and will also come to
your phone or IM client if you've set them up to receive notices.

Private groups
--------------

The administrator can make a group private. For a private group, all
notices will marked as private for group members only. Also,
administrators will have to approve all new members to the group.

Private groups are visible in the group directory.

path: doc-src/groups


code:
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- https://creativecommons.org/licenses/by/3.0/ for details. -->

%%site.name%% is a **social service**. Users can post short
(%%site.textlimit%% character) status messages which are broadcast to
their friends and colleagues on the service and (optionally) onto the Web.

You can also broadcast other types of data, like bookmarks, event
invitations, polls, and questions.

If you'd like to try it out, first [register](%%action.register%%) a new account.
Then, on the [public timeline](%%action.top%%), enter your message into
the textbox at the top of the page, and click "Send". It will go out on the
public timeline and to anyone who is subscribed to your notices.

To subscribe to other people's notifications, go to their profile page
and click the "subscribe" button. They'll get a notice that you're now
subscribed to their notifications.

path: doc-src/help


code:
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- https://creativecommons.org/licenses/by/3.0/ for details. -->

You can post messages to %%site.name%% using a [Jabber](http://jabber.org/) client
on your computer, mobile phone, or other platform. This can be a convenient way to
keep up with your friends on %%site.name%%.

If you don't already have a Jabber account, one of the
[public Jabber services](http://www.jabber.org/im-services). You'll probably also
need an IM client like [Pidgin](https://www.pidgin.im/).

Managing your IM settings
-------------------------

Use the [IM settings](%%action.imsettings%%) page to set your IM preferences. You can add or change your Jabber address and set the flags for Jabber update.

When you add or change your address, you'll receive a message from **%%xmpp.user%%@%%xmpp.server%%** asking you to confirm the change. (You may need to
add %%xmpp.user%%@%%xmpp.server%% to your buddy list *before* changing your IM settings.)

Sending updates
---------------

You send updates by sending messages to %%xmpp.user%%@%%xmpp.server%%. Messages
should be less than %%site.textlimit%% characters; longer messages will be truncated.

Commands
--------

You can do some minor management of your account through Jabber. These are the
currently-implemented commands:

* **on** - turn on notifications
* **off** - turn off notifications
* **help** - show this help
* **follow <nickname>** - subscribe to user
* **groups** - lists the groups you have joined
* **subscriptions** - list the people you follow
* **subscribers** - list the people that follow you
* **leave <nickname>** - unsubscribe from user
* **d <nickname> <text>** - direct message to user
* **get <nickname>** - get last notice from user
* **whois <nickname>** - get profile info on user
* **lose <nickname>** - force user to stop following you
* **fav <nickname>** - add user's last notice as a 'fave'
* **fav #<notice_id>** - add notice with the given id as a 'fave'
* **repeat #<notice_id>** - repeat a notice with a given id
* **repeat <nickname>** - repeat the last notice from user
* **reply #<notice_id>** - reply to notice with a given id
* **reply <nickname>** - reply to the last notice from user
* **join <group>** - join group
* **login** - Get a link to login to the web interface
* **drop <group>** - leave group
* **stats** - get your stats
* **stop** - same as 'off'
* **quit** - same as 'off'
* **sub <nickname>** - same as 'follow'
* **unsub <nickname>** - same as 'leave'
* **last <nickname>** - same as 'get'
* **on <nickname>** - not yet implemented.
* **off <nickname>** - not yet implemented.
* **nudge <nickname>** - remind a user to update.
* **invite <phone number>** - not yet implemented.
* **track <word>** - not yet implemented.
* **untrack <word>** - not yet implemented.
* **track off** - not yet implemented.
* **untrack all** - not yet implemented.
* **tracks** - not yet implemented.
* **tracking** - not yet implemented.

path: doc-src/im


code:
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- https://creativecommons.org/licenses/by/3.0/ for details. -->

This document outlines this service's respect for your personal
privacy as a user of the service.

- Almost all the text and files that users upload to this site is
  available under the site license (see the license block at the bottom
  of this page). Users agree to the license when they register to use
  the site for the first time. Typically that means that the data can
  be copied far and wide, for commercial and non-commercial purposes,
  and in modified or unmodified form. If you're not OK with that,
  don't use the service.
- The following data items are considered *private data* that won't be
  shared with other users, business partners, or the public at large:
  * your password
  * your email address
  * your IM address (AIM, Jabber, or other instant messaging address)
  * your phone number
  * your "private messages"
  * your login credentials (username and password) for other services (Twitter, Facebook, etc.)
- Some private data may be published in aggregate, e.g. "30% of our
  users are registered with Hotmail addresses."
- Your notices (including files) can be downloaded and re-used by
  other services, either one-by-one or in bulk as
  [RSS](https://en.wikipedia.org/wiki/RSS) files.
- Your profile information (including subscriptions and avatars) can be
  downloaded and re-used by other services, either scraped from the HTML
  interface or in bulk as [FOAF](https://en.wikipedia.org/wiki/FOAF) files.
- Your notices will be forwarded to users who subscribe to them,
  including users on another microblogging service.
- Your profile information will be sent to microblogging services for
  users who subscribe to you or to whom you subscribe.
- Based on your email preferences, you may receive automated email
  messages for important system events, such as when others subscribe
  to your notices.
- Based on your email preferences, you may receive an email
  newsletter. You can opt out of the newsletter if you don't want to
  receive it.
- In urgent situations, administrators may send you email directly to
  your registered email address, even if you've requested no notices
  or newsletter. *Administrators will use digitally-signed email.*
- This service will comply with court orders to turn over your private
  information.

path: doc-src/privacy


code:
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- https://creativecommons.org/licenses/by/3.0/ for details. -->

You can post messages to %%site.name%% using many kinds of cell
phones that support SMS messaging. This site does not support SMS
directly; rather, it uses your carrier's email gateway to send and
receive messages.

Managing your SMS settings
--------------------------

Use the [SMS settings](%%action.smssettings%%) page to set your SMS
preferences. You can add or change your SMS number and set the
flags for SMS updates.

When you add or change your phone number, you'll receive a message on your
phone with a verification code. Enter it into the SMS settings page to
confirm that the owner of the phone authorizes sending it messages.

Note that only the carriers listed in the drop down list on the form
are supported by %%site.name%%. They're the only ones we know how to
make email addresses for.

Receiving messages
------------------

Once you've verified your phone number, you can enable sending
messages to your phone. If you have a lot of friends and a typical
phone, it can be hard to keep up.

Sending messages
----------------

To send a message, you must send an email to the incoming email
address visible on your SMS settings page. The method for sending
email from your phone varies from carrier to carrier and from handset
to handet; if in doubt, ask your carrier.

Keep your incoming email address a secret -- it's the only way we know
you're really you!

Commands
--------

You can use the following commands with %%site.name%%.

* on - turn on notifications
* off - turn off notifications
* help - show this help
* follow <nickname> - subscribe to user
* leave <nickname> - unsubscribe from user
* d <nickname> <text> - direct message to user
* get <nickname> - get last notice from user
* whois <nickname> - get profile info on user
* fav <nickname> - add user's last notice as a 'fave'
* stats - get your stats
* stop - same as 'off'
* quit - same as 'off'
* sub <nickname> - same as 'follow'
* unsub <nickname> - same as 'leave'
* last <nickname> - same as 'get'
* on <nickname> - not yet implemented.
* off <nickname> - not yet implemented.
* nudge <nickname> - not yet implemented.
* invite <phone number> - not yet implemented.
* track <word> - not yet implemented.
* untrack <word> - not yet implemented.
* track off - not yet implemented.
* untrack all - not yet implemented.
* tracks - not yet implemented.
* tracking - not yet implemented.

path: doc-src/sms


code:
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- https://creativecommons.org/licenses/by/3.0/ for details. -->

This service uses a Free microblogging tool called **GNU social**.
GNU social is available under the [GNU Affero General Public License
Version 3.0](https://www.fsf.org/licensing/licenses/agpl-3.0.html), a
Free Software license for network services.

You can get a copy of the software by following links from the
[GNU social main site](https://gnu.io/)¹. The version of the software
that runs on *this* site is unmodified from that version. The site
also depends on certain libraries and other software; these are all
bundled in the [GNU social repository](https://git.gnu.io/gnu/gnu-social)²
and release archive files.

References
----------
1. GNU social main site, <https://gnu.io>
2. GNU social repository, <https://git.gnu.io/gnu/gnu-social>

path: doc-src/source


code:
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- https://creativecommons.org/licenses/by/3.0/ for details. -->

%%site.name%% supports
[tags](https://en.wikipedia.org/wiki/Tag_(metadata)) to help you
organize your activities here. You can use tags for people and for
notices.

Tagging a notice
----------------

You can tag a notice using a *hashtag*; a # character followed by
letters and numbers as well as '.', '-', and '_'. Note that accented
latin characters are not supported, and non-roman scripts are right out.

The HTML for the notice will link to a stream of all the other notices
with that tag. This can be a great way to keep track of a conversation.

Tagging yourself
----------------

You can also add tags for yourself on your [profile
settings](%%action.profilesettings%%) page or by using the edit tags
button on your profile page. Use single words to
describe yourself, your experiences and your interest. The tags will
become links on your profile page to a list of all the users on the
site who use that same tag. It can be a nice way to find people who
are related to you geographically or who have a common interest.

Tagging others
--------------

You can also tag other users by using the edit tags button next to
their profile. Such tags are called *people tags*. Once you have
created a people tag, you can add or remove users from it using the
tag's edit form. This makes it easy to organize your subscriptions
into groups and sort through them separately. Also, it will let
you create custom lists of people that others can subscribe to.

You can also send a notice "to the attention of" your subscribers
whom you've marked with a particular tag (note: *not* people who've
marked themselves with that tag). "@#family hello" will send a
notice to all your subscribers you've marked with the tag 'family'.

Private and public people tags
------------------------------

A private people tag is only visible to the creator, it cannot be
subscribed to, but the timeline can be viewed. To create a new
private prepend a '.' to the tag in the tags editing box. To set
an existing public tag as private or vice-versa, go to the tag's
edit page.

path: doc-src/tags


code:
The gist
--------

We (the folks at [%%site.broughtby%%](%%site.broughtbyurl%%)) run a
service called %%site.name%% and would love for you to use it. Our
service is designed to give you as much control and ownership over
what goes in your notice stream as possible and encourage you to
express yourself freely. However, be responsible in what you post. In
particular, make sure that none of the prohibited items listed below
appear in your notice stream or get linked to from your notice stream (things
like spam, viruses, or hate content).

You can review our [Public Stream](%%action.top%%) to get a sense
of the types of notices that are welcome on our service (or not!). If
you find a %%site.name%% account that you believe violates our terms
of service, please check our [Contact](%%doc.contact%%) documentation.

(Note: Automattic, Inc., original creators of the below Terms of
Service, decided to make them available under a Creative Commons
Sharealike license, which means you’re more than welcome to steal it
and repurpose it for your own use. Just make sure to replace
references to us with ones to you. They’d appreciate a link to
[WordPress.com](https://wordpress.com/) somewhere on your site.
They spent a lot of money and time on the below, and other people
shouldn’t need to do the same. (We didn't!))

Terms of Service
----------------

The following terms and conditions govern all use of the %%site.name%%
website and all content, services and products available at or through
the website (taken together, the Website). The Website is owned and
operated by %%site.broughtby%% (“Operator”). The Website is offered
subject to your acceptance without modification of all of the terms
and conditions contained herein and all other operating rules,
policies (including, without limitation, Operator’s [Privacy
Policy](%%doc.privacy%%))
and procedures that may be published from time to time on this Site by
Operator (collectively, the “Agreement”).

Please read this Agreement carefully before accessing or using the
Website. By accessing or using any part of the web site, you agree to
become bound by the terms and conditions of this agreement. If you do
not agree to all the terms and conditions of this agreement, then you
may not access the Website or use any services. If these terms and
conditions are considered an offer by Operator, acceptance is
expressly limited to these terms. The Website is available only to
individuals who are at least 13 years old.

Your %%site.name%% Account and Site. If you
create a notice stream on the Website, you are responsible for
maintaining the security of your account and notice stream, and you
are fully responsible for all activities that occur under the account
and any other actions taken in connection with the notice stream. You
must not describe or assign keywords to your notice stream in a
misleading or unlawful manner, including in a manner intended to trade
on the name or reputation of others, and Operator may change or remove
any description or keyword that it considers inappropriate or
unlawful, or otherwise likely to cause Operator liability. You must
immediately notify Operator of any unauthorized uses of your notice
stream, your account or any other breaches of security. Operator will
not be liable for any acts or omissions by You, including any damages
of any kind incurred as a result of such acts or omissions.

Responsibility of Contributors. If you operate a
notice stream, comment on a notice stream, post material to the
Website, post links on the Website, or otherwise make (or allow any
third party to make) material available by means of the Website (any
such material, “Content”), You are entirely responsible for the
content of, and any harm resulting from, that Content. That is the
case regardless of whether the Content in question constitutes text,
graphics, an audio file, or computer software. By making Content
available, you represent and warrant that:

the downloading, copying and use of the Content will not infringe
the proprietary rights, including but not limited to the copyright,
patent, trademark or trade secret rights, of any third party;

if your employer has rights to intellectual property you create,
you have either (i) received permission from your employer to post or
make available the Content, including but not limited to any software,
or (ii) secured from your employer a waiver as to all rights in or to
the Content;

you have fully complied with any third-party licenses
relating to the Content, and have done all things necessary to
successfully pass through to end users any required terms;

the Content does not contain or install any viruses, worms, malware,
Trojan horses or other harmful or destructive content;

the Content is not spam, and does not contain unethical or
unwanted commercial content designed to drive traffic to third party
sites or boost the search engine rankings of third party sites, or to
further unlawful acts (such as phishing) or mislead recipients as to
the source of the material (such as spoofing);

if the Content is machine- or randomly-generated, it is for
purposes of direct entertainment, information and/or utility for you
or other users, and not for spam,

the Content is not libelous or defamatory (more info on
what that means), does not contain threats or incite violence towards
individuals or entities, and does not violate the privacy or publicity
rights of any third party;

your notice stream is not getting advertised via unwanted electronic
messages such as spam links on newsgroups, email lists, other notice streams
and web sites, and similar unsolicited promotional methods;

your notice stream is not named in a manner that misleads your
readers into thinking that you are another person or company. For
example, your notice stream’s URL or name is not the name of a person other
than yourself or company other than your own; and

you have, in the case of Content that includes computer code,
accurately categorized and/or described the type, nature, uses and
effects of the materials, whether requested to do so by Operator or
otherwise.

By submitting Content to Operator for inclusion on your Website, you
grant Operator a world-wide, royalty-free, and non-exclusive license
to reproduce, modify, adapt and publish the Content solely for the
purpose of displaying, distributing and promoting your notice
stream.

By submitting Content to Operator for inclusion on your Website,
you grant all readers the right to use, re-use, modify and/or
re-distribute the Content under the terms of the %%license.title%%.

If you delete Content, Operator will use reasonable efforts to remove it from
the Website, but you acknowledge that caching or references to the
Content may not be made immediately unavailable.

Without limiting any of those representations or warranties, Operator
has the right (though not the obligation) to, in Operator’s sole
discretion (i) refuse or remove any content that, in Operator’s
reasonable opinion, violates any Operator policy or is in any way
harmful or objectionable, or (ii) terminate or deny access to and use
of the Website to any individual or entity for any reason, in
Operator’s sole discretion.

Responsibility of Website Visitors. Operator has not reviewed,
and cannot review, all of the material, including computer software,
posted to the Website, and cannot therefore be responsible for that
material’s content, use or effects. By operating the Website,
Operator does not represent or imply that it endorses the material
there posted, or that it believes such material to be accurate, useful
or non-harmful. You are responsible for taking precautions as
necessary to protect yourself and your computer systems from viruses,
worms, Trojan horses, and other harmful or destructive content. The
Website may contain content that is offensive, indecent, or otherwise
objectionable, as well as content containing technical inaccuracies,
typographical mistakes, and other errors. The Website may also contain
material that violates the privacy or publicity rights, or infringes
the intellectual property and other proprietary rights, of third
parties, or the downloading, copying or use of which is subject to
additional terms and conditions, stated or unstated. Operator
disclaims any responsibility for any harm resulting from the use by
visitors of the Website, or from any downloading by those visitors of
content there posted.

Content Posted on Other Websites. We have not reviewed, and
cannot review, all of the material, including computer software, made
available through the websites and webpages to which %%site.name%%
links, and that link to %%site.name%%. Operator does not have any
control over those external websites and webpages, and is not
responsible for their contents or their use. By linking to a
external website or webpage, Operator does not represent or
imply that it endorses such website or webpage. You are responsible
for taking precautions as necessary to protect yourself and your
computer systems from viruses, worms, Trojan horses, and other harmful
or destructive content. Operator disclaims any responsibility for
any harm resulting from your use of external websites and
webpages.

Copyright Infringement and DMCA Policy. As Operator asks
others to respect its intellectual property rights, it respects the
intellectual property rights of others. If you believe that material
located on or linked to by %%site.name%% violates your copyright, you
are encouraged to notify Operator in accordance with Operator’s
Digital Millennium Copyright Act (”DMCA”) Policy. Operator will
respond to all such notices, including as required or appropriate by
removing the infringing material or disabling all links to the
infringing material. In the case of a visitor who may infringe or
repeatedly infringes the copyrights or other intellectual property
rights of Operator or others, Operator may, in its discretion,
terminate or deny access to and use of the Website. In the case of
such termination, Operator will have no obligation to provide a
refund of any amounts previously paid to Operator.

Intellectual Property. This Agreement does not
transfer from Operator to you any Operator or third party intellectual
property, and all right, title and interest in and to such property
will remain (as between the parties) solely with Operator.
%%site.name%%, the %%site.name%% logo, and all other trademarks,
service marks, graphics and logos used in connection with
%%site.name%%, or the Website are trademarks or registered trademarks
of Operator or Operator’s licensors. Other trademarks, service marks,
graphics and logos used in connection with the Website may be the
trademarks of other third parties. Your use of the Website grants you
no right or license to reproduce or otherwise use any Operator or
third-party trademarks.

Changes. Operator reserves the right, at its sole
discretion, to modify or replace any part of this Agreement. It is
your responsibility to check this Agreement periodically for changes.
Your continued use of or access to the Website following the posting
of any changes to this Agreement constitutes acceptance of those
changes. Operator may also, in the future, offer new services and/or
features through the Website (including, the release of new tools and
resources). Such new features and/or services shall be subject to the
terms and conditions of this Agreement.

Termination. Operator may terminate your access
to all or any part of the Website at any time, with or without cause,
with or without notice, effective immediately. If you wish to
terminate this Agreement or your %%site.name%% account (if you have
one), you may simply discontinue using the Website. All provisions of
this Agreement which by their nature should survive termination shall
survive termination, including, without limitation, ownership
provisions, warranty disclaimers, indemnity and limitations of
liability.

Disclaimer of Warranties. The Website is provided
“as is”. Operator and its suppliers and licensors hereby disclaim all
warranties of any kind, express or implied, including, without
limitation, the warranties of merchantability, fitness for a
particular purpose and non-infringement. Neither Operator nor its
suppliers and licensors, makes any warranty that the Website will be
error free or that access thereto will be continuous or uninterrupted.
If you’re actually reading this, here’s a treat. You understand that
you download from, or otherwise obtain content or services through,
the Website at your own discretion and risk.

Limitation of Liability. In no event will
Operator, or its suppliers or licensors, be liable with respect to any
subject matter of this agreement under any contract, negligence,
strict liability or other legal or equitable theory for: (i) any
special, incidental or consequential damages; (ii) the cost of
procurement or substitute products or services; (iii) for interruption
of use or loss or corruption of data; or (iv) for any amounts that
exceed the fees paid by you to Operator under this agreement during
the twelve (12) month period prior to the cause of action. Operator
shall have no liability for any failure or delay due to matters beyond
their reasonable control. The foregoing shall not apply to the extent
prohibited by applicable law.

General Representation and Warranty. You
represent and warrant that (i) your use of the Website will be in
strict accordance with the Operator Privacy Policy, with this
Agreement and with all applicable laws and regulations (including
without limitation any local laws or regulations in your country,
state, city, or other governmental area, regarding online conduct and
acceptable content, and including all applicable laws regarding the
transmission of technical data exported from the United States or the
country in which you reside) and (ii) your use of the Website will not
infringe or misappropriate the intellectual property rights of any
third party.

Indemnification. You agree to indemnify and hold
harmless Operator, its contractors, and its licensors, and their
respective directors, officers, employees and agents from and against
any and all claims and expenses, including attorneys’ fees, arising
out of your use of the Website, including but not limited to out of
your violation this Agreement.

Miscellaneous. This Agreement constitutes the
entire agreement between Operator and you concerning the subject
matter hereof, and they may only be modified by a written amendment
signed by an authorized executive of Operator, or by the posting by
Operator of a revised version. If any part of this Agreement is held
invalid or unenforceable, that part will be construed to reflect the
parties’ original intent, and the remaining portions will remain in
full force and effect. A waiver by either party of any term or
condition of this Agreement or any breach thereof, in any one
instance, will not waive such term or condition or any subsequent
breach thereof. You may assign your rights under this Agreement to any
party that consents to, and agrees to be bound by, its terms and
conditions; Operator may assign its rights under this Agreement
without condition. This Agreement will be binding upon and will inure
to the benefit of the parties, their successors and permitted
assigns.

*Originally published by Automattic, Inc. as the [WordPress.com Terms
of Service](https://en.wordpress.com/tos/) and made available by them
under the [Creative Commons Attribution-ShareAlike 3.0
License](https://creativecommons.org/licenses/by-sa/3.0/).
Modifications to remove reference to "VIP services", rename "blog" to
"notice stream", remove the choice-of-venue clause, and add variables
specific to instances of this software made by Control Yourself, Inc.
and made available under the terms of the same license.*

path: doc-src/tos


code:
## Authentication

### HTTP Basic authentication

The API uses [HTTP Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication).
Note that this means that users with only an OpenID login cannot use the API; they have to add a
password to their account using the control panel on the site.

### OAuth authentication

OAuth 1.0a authentication for API resources is also supported. Generally, StatusNet's
UI and API are similar to Twitter's for OAuth applications (if you're new to OAuth
check out [Beginner’s Guide to OAuth](http://hueniverse.com/oauth/)).

To use OAuth, you'll need to register your client application via the web interface
and obtain a consumer key and secret. You can find the interface for application
registration at [%%action.oauthappssettings%%](%%action.oauthappssettings%%).

## JSONP callbacks

For API methods that return [JSON](https://en.wikipedia.org/wiki/JSON), an optional
JSONP-style callback parameter is supported. If supplied, the response will be in
JSONP format with a callback of the given name. To make it easier for clients to
handle error conditions, HTTP error codes are suppressed, and the errors will be
returned in the response body when using JSONP.

## Rate limiting

There is currently no rate-limiting.

## Gotchas

Some things to remember:

* %%site.name%% supports the
  [OStatus federation protocol](https://en.wikipedia.org/wiki/OStatus) (as well as
  [OpenMicroBlogging](https://en.wikipedia.org/wiki/OpenMicroBlogging) for backwards
  compatibility), so many notices and friends' profiles may come from other servers.
* User nicknames are unique, but they are not globally unique. Use the ID number
  instead.
* Private streams are not implemented yet.
* GNU social sites can be configured as private. In that case, all API methods
  require authentication, including the public timeline (see the 'config' method
  below).
* If "Fancy URLs" are not enabled, urls from above need to include "index.php" at
  the root. ( e.g. http://example.org/statusnet/api becomes http://www.example.org/statusnet/index.php/api )
* The `since_id` parameter does not work as documented by Twitter. Twitter says of
  `since_id`: "There are limits to the number of Tweets which can be accessed
  through the API. If the limit of Tweets has occured since the `since_id`, the
  `since_id` will be forced to the oldest ID available." However, GNU social will
  return the newest notices (or the newest back from max_id, if present)! Also, a
  `since_id` <= 0 will be ignored.

## Timeline resources

### statuses/public_timeline

Returns the 20 most recent notices, including repeats if they exist, from
non-protected users.

### statuses/home_timeline

Returns the 20 most recent notices, including repeats if they exist, posted by the
authenticating user and the users they follow. This is the same timeline seen by a
user when they login to their instance. This method is identical to
statuses/friends_timeline, except that this method always includes repeats.

### statuses/friends_timeline

Alias of statuses/home_timeline

### statuses/friends_timeline/:username

Alias of statuses/home_timeline for the specified username

### statuses/mentions

Returns the 20 most recent mentions (notices containing @username) for the
authenticating user.

This method will not include repeats in the XML and JSON responses unless the
include_rts parameter is set. The RSS and Atom responses will always include repeats
as notices prefixed with RT.

### statuses/replies

Alias of statuses/mentions

### statuses/replies/:username

Alias of statuses/mentions for the specified username

### statuses/user_timeline

Returns the 20 most recent notices posted by the authenticating user. It is also
possible to request another user's timeline by using the screen\_name or user_id
parameter. The other users timeline will only be visible if they are not protected,
or if the authenticating user's follow request was accepted by the protected user.

This method will not include repeats in the XML and JSON responses unless the
include_rts parameter is set. The RSS and Atom responses will always include
repeats as notices prefixed with RT, regardless of provided parameters.

### statuses/retweeted\_to_me

Not implemented.

### statuses/retweeted\_by_me

Not implemented.

### statuses/retweets\_of_me

Not implemented.

## Status resources

### statuses/show/:id

Returns a single notice, specified by the id parameter. The notice's author will be
returned inline.

### statuses/update

Post a new notice as the authenticating user.

Additional 'media' parameter allows binary multimedia uploads (images, etc.). Format
post data as multipart/form-data when using the 'media' parameter.

### statuses/destroy/:id

Destroys the notice specified by the required ID parameter. The authenticating user
must be the author of the specified notice. Returns the destroyed notice if successful.

### statuses/retweet/:id

Repeats a notice. Returns the original notice with repeat details embedded.

## User resources

### statuses/friends

Returns the user's subscriptions (friends) as an array of profiles.

### statuses/followers

Returns the user's subscribers (followers) as an array of profiles.

### users/show

Returns extended information of a given user, specified by ID or screen name as per
the required id parameter.

## Direct message resources

### direct_messages

Returns the 20 most recent direct messages sent to the authenticating user. The XML
and JSON versions include detailed information about the sender and recipient user.

### direct_messages/sent

Returns the 20 most recent direct messages sent by the authenticating user. The XML
and JSON versions include detailed information about the sender and recipient user.

### direct_messages/new

Sends a new direct message to the specified user from the authenticating user.
Requires both the user and text parameters and must be a POST. Returns the sent
message in the requested format if successful.

### direct_messages/destroy

Not implemented.

## Friendships resources

### friendships/create

Allows the authenticating users to follow the user specified in the ID parameter.
Returns the befriended user in the requested format when successful. Returns a
string describing the failure condition when unsuccessful.

If you are already friends with the user a HTTP 403 may be returned, though for
performance reasons you may get a 200 OK message even if the friendship already
exists.

Note that users cannot subscribe to remote profiles using this API.

### friendships/destroy

Allows the authenticating users to unfollow the user specified in the ID parameter.
Returns the unfollowed user in the requested format when successful. Returns a
string describing the failure condition when unsuccessful.

Users can unsubscribe to a remote profile using this API, but it's preferred to use
numeric IDs to nicknames.

### friendships/exists

Test for the existence of friendship between two users. Will return true if user\_a
follows user_b, otherwise will return false. Authentication is required if either
user A or user B are protected. Additionally the authenticating user must be a
follower of the protected user.

### friendships/show

Returns detailed information about the relationship between two users.

## Friends and subscribers resources

### friends/ids

Returns an array of numeric IDs for every user the specified user is subscribed to.
This method is powerful when used in conjunction with users/lookup.

### followers/ids

Returns an array of numeric IDs for every user subscsribed to the specified user.
This method is powerful when used in conjunction with users/lookup.

## Account resources

### account/verify_credentials

Returns an HTTP 200 OK response code and a representation of the requesting user if
authentication was successful; returns a 401 status code and an error message if
not. Use this method to test if supplied user credentials are valid.

### account/end_session

Not implemented.

### account/update\_delivery_device

Not implemented.

### account/rate\_limit_status

Returns the remaining number of API requests available to the requesting user before
the API limit is reached.

We have no rate limit, so this always returns 150 hits left.

### account/update\_profile\_background_image

Updates the authenticating user's profile background image. This method can also be
used to enable or disable the profile background image.

### account/update\_profile_image

Updates the authenticating user's profile image. Note that this method expects raw
multipart data, not a URL to an image.

## Favorite resources

### favorites

Returns the 20 most recent favorite statuses for the authenticating or specified
user in the requested format.

### favorites/create/:id

Favorites the status specified in the ID parameter as the authenticating user.
Returns the favorite status when successful.

### favorites/destroy/:id

Un-favorites the status specified in the ID parameter as the authenticating user.
Returns the un-favorited status in the requested format when successful.

## Notification resources

### notifications/follow

Not implemented.

### notifications/leave

Not implemented.

## Block resources

### blocks/create

Blocks the specified user from following the authenticating user. In addition the
blocked user will not show in the authenticating users mentions or timeline (unless
retweeted by another user). If a follow or friend relationship exists it is
destroyed.

### blocks/destroy

Un-blocks the user specified in the ID parameter for the authenticating user.
Returns the un-blocked user in the requested format when successful. If
relationships existed before the block was instated, they will not be restored.

### blocks/exists

Not implemented.

### blocks/blocking

Not implemented.

## Help resources

### help/test

Returns the string "ok" in the requested format with a 200 OK HTTP status code. This
method is great for sending a HEAD request to determine our servers current time.

## OAuth resources

It is strongly recommended you use HTTPS for all OAuth authorization steps.

### oauth/request_token

Allows a Consumer application to obtain an OAuth Request Token to request user
authorization. This method fulfills Section 6.1 of the OAuth 1.0 authentication
flow. It is strongly recommended you use HTTPS for all OAuth authorization steps.

### oauth/authorize

Allows a Consumer application to use an OAuth Request Token to request user
authorization. This method fulfills Section 6.2 of the OAuth 1.0 authentication
flow. Desktop applications must use this method (and cannot use GET oauth/authenticate).

### oauth/access_token

Allows a Consumer application to exchange the OAuth Request Token for an OAuth
Access Token. This method fulfills Section 6.3 of the OAuth 1.0 authentication flow.
The OAuth access token may also be used for xAuth operations.

## Search

The search method supports the following optional URL parameters:

* **callback**: if supplied when using the JSON format, the response will use the
  JSONP format with a callback of the given name.
* **rpp**: the number of notices to return per page, up to a max of 100.
* **page**: the page number (starting at 1) to return.
* **since_id:**: returns notices with ids greater than the given id.

Note:

* The search does not support operators, such as "from:", "to:" and booleans.
* Notice content is HTML-encoded.

### search

Returns relevant notices that match a specified query.

### Atom

To request search results in Atom, append your URL-encoded query as a parameter to
the search method and specify the Atom format:

`%%site.server%%/%%site.path%%api/search.atom?q=<query>`

### JSON

To request search results in JSON, append your URL-encoded query as a parameter to
the search method and specify the JSON format:

`%%site.server%%/%%site.path%%api/search.json?q=<query>`

## Additional resources

These are extensions to the Twitter API that expose additional functionality.

### Group resources

#### statusnet/groups/timeline

Shows a group's timeline. Similar to other timeline resources.

#### statusnet/groups/show

Show a groups profile.

#### statusnet/groups/create

Create a new group.

#### statusnet/groups/join

Join a group.

#### statusnet/groups/leave

Leave a group.

#### statusnet/groups/list

Show the groups a given user is a member of.

#### statusnet/groups/list_all

List all local groups.

#### statusnet/groups/membership

List the members of a given group.

#### statusnet/groups/is_member

Determine whether a given user is a member of a given group.

### Tag resources

#### statusnet/tags/timeline

Shows a tag's timeline. Similar to other timeline resources.

### Media resources

#### statusnet/media/upload

Endpoint for uploading an image. Returns a URL that can be used in a status update.
Format post data as multipart/form-data.

### Configuration

#### statusnet/config

Show an instance's configuration information.

Of special note is the `<private>` element (config/site/private), which indicates
whether a site is private. When a site is configured as private every other API
method requires authentication, including the public timeline (`/api/statuses/public_timeline.format`).

path: doc-src/twitterapi