PHPackages                             horde/content - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. horde/content

ActiveHorde-application[Utility &amp; Helpers](/categories/utility)

horde/content
=============

Tagging application

v3.0.0(5d ago)11.4k↑400%36BSD-2-ClausePHPPHP ^8.1CI failing

Since Jul 16Pushed 4d ago5 watchersCompare

[ Source](https://github.com/horde/content)[ Packagist](https://packagist.org/packages/horde/content)[ Docs](https://www.horde.org)[ RSS](/packages/horde-content/feed)WikiDiscussions FRAMEWORK\_6\_0 Synced today

READMEChangelog (4)Dependencies (35)Versions (21)Used By (6)

Content
=======

[](#content)

Content is the Horde tagging engine. It stores tags, references to the objects they are applied to and keys for the users who applied them. Any Horde application can tag arbitrary objects (contacts, events, tasks, bookmarks, etc.) through a shared vocabulary. This enables cross-application tag searches and tag clouds.

Core classes:

- **`Content_Tagger`** -- The main API for tagging, untagging, searching, and building tag clouds.
- **`Content_Types_Manager`** / **`Content_Objects_Manager`** / **`Content_Users_Manager`** -- manage the type, object, and user registries that `Content_Tagger` depends on.

Application integration
-----------------------

[](#application-integration)

Horde applications do not call the HTTP endpoints directly. Instead each app defines a thin wrapper that extends `Horde_Core_Tagger` and declares its app name and supported object types:

```
class Nag_Tagger extends Horde_Core_Tagger
{
    protected $_app = 'nag';
    protected $_types = ['task'];
}
```

`Horde_Core_Tagger` obtains a `Content_Tagger` instance via the injector and delegates the heavy lifting. Apps that follow this pattern include **Kronolith**(events), **Turba** (contacts), **Nag** (tasks), **Mnemo** (notes), **Trean**(bookmarks), **Ansel** (photos/galleries), and **Jonah** (stories).

The most commonly used operations are `tag()`, `untag()`, `replaceTags()`, `getTags()`, `getObjects()`, and `getTagCloud()`.

HTTP endpoints
--------------

[](#http-endpoints)

Content also exposes a set of PSR-15 request handlers mounted under the application's web root. All endpoints currently require a Horde session (default middleware stack).

PLANNED FEATURE: Allow making some endpoints public by opt-in.

### GET /tags

[](#get-tags)

Search or list tags. Returns all tags when called without parameters.

ParameterDescription`q`Starts-with search on tag text`typeId`Restrict to tags on objects of this type`userId`Restrict to tags applied by this user`objectId`Restrict to tags on this object`limit`Maximum number of results`offset`Result offset for pagination`format``json` (default), `html`, `atom`, or `rss`### GET /tags/recent

[](#get-tagsrecent)

Most recently used tags.

ParameterDescription`limit`Maximum number of tags (default 10)`offset`Result offset for pagination`typeId`Restrict to tags on objects of this type`userId`Restrict to tags applied by this user`format``json` (default), `html`, `atom`, or `rss`### POST /tag

[](#post-tag)

Tag an object. Accepts `POST` or `PUT`.

ParameterRequiredDescription`userId`yesUser applying the tag`objectId`yesObject identifier`tags`yesTag name(s) to apply`typeId`yesObject typeReturns `204 No Content` on success.

### POST /untag

[](#post-untag)

Remove a tag from an object. Accepts `POST` or `DELETE`.

Same parameters as `/tag`. Returns `204 No Content` on success.

###  Health Score

61

—

FairBetter than 98% of packages

Maintenance99

Actively maintained with recent releases

Popularity23

Limited adoption so far

Community32

Small or concentrated contributor base

Maturity81

Battle-tested with a long release history

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~368 days

Recently: every ~98 days

Total

13

Last Release

5d ago

Major Versions

2.0.6 → 3.0.0alpha12021-02-24

PHP version history (5 changes)2.0.4PHP &gt;=5.3.0,&lt;=6.0.0alpha1

2.0.6PHP ^5.3 || ^7

3.0.0alpha1PHP ^7

v3.0.0alpha4PHP ^7.4 || ^8

v3.0.0alpha7PHP ^8.1

### Community

Maintainers

![](https://www.gravatar.com/avatar/c943a083635c28520599075eaea7ede2d743b7697b76e84d6bdc37e52cc8249b?d=identicon)[yunosh](/maintainers/yunosh)

![](https://www.gravatar.com/avatar/c931cd02664859360478593450d6c473a05bb12b209dfacfc534cd13257cc7ef?d=identicon)[ralflang](/maintainers/ralflang)

![](https://www.gravatar.com/avatar/e4f6c6771993db2ed500959b42353f6cf6a2ca0406d9617f7ae680f4504faa4a?d=identicon)[horde](/maintainers/horde)

![](https://www.gravatar.com/avatar/a7767adb66b45f2f05bcd44d49bc4e67efacd9ce05b161ce2d481d5dd6af025c?d=identicon)[mrubinsk](/maintainers/mrubinsk)

![](https://www.gravatar.com/avatar/816e2b926f25f8cd2939054c7a7173011b4303d690e25ab61bf33cf8c7cf71ae?d=identicon)[tdannhauer](/maintainers/tdannhauer)

---

Top Contributors

[![yunosh](https://avatars.githubusercontent.com/u/379318?v=4)](https://github.com/yunosh "yunosh (123 commits)")[![mrubinsk](https://avatars.githubusercontent.com/u/66822?v=4)](https://github.com/mrubinsk "mrubinsk (113 commits)")[![ralflang](https://avatars.githubusercontent.com/u/646976?v=4)](https://github.com/ralflang "ralflang (42 commits)")[![slusarz](https://avatars.githubusercontent.com/u/381003?v=4)](https://github.com/slusarz "slusarz (7 commits)")[![wrobel](https://avatars.githubusercontent.com/u/10232?v=4)](https://github.com/wrobel "wrobel (5 commits)")[![remicollet](https://avatars.githubusercontent.com/u/270445?v=4)](https://github.com/remicollet "remicollet (1 commits)")

---

Tags

tagstagger

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/horde-content/health.svg)

```
[![Health](https://phpackages.com/badges/horde-content/health.svg)](https://phpackages.com/packages/horde-content)
```

###  Alternatives

[horde/horde

Horde base application

583.0k71](/packages/horde-horde)[horde/kronolith

Calendar and scheduling application

101.5k5](/packages/horde-kronolith)[horde/imp

Webmail application

261.3k](/packages/horde-imp)[horde/imap_client

IMAP client library

275.5k22](/packages/horde-imap-client)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
