All Calendar
My Calendar
World Calendar
π₯ Incoming Claims (Cash Sales)
These are log book products sent to your email. Sign in with the matching email, then claim them here.
π Log Book Purchases / Owned Records
These are log book records you currently own. You can resell via + Product in the TXTWRK post box, or cash sale directly from here without creating a new post.
π Pending / Listed Log Book Sales
These are your log book records that are listed, pending, or waiting for a buyer to claim by email.
π All Purchases
Every item you purchased across the network.
π° Sales Made (Sold Items)
Records of products you have sold to others.
π Previous History
Coming soonβ¦
View:
Active Checklists
Pending Checklists
My Checklists
Your Data
Click the button below to download all your data from our platform in CSV format (e.g., posts, purchases).
Download My Data
Forever Data Preservation
Preserve your digital legacy indefinitely on TXTWRK. Meaningful content β posts, creations, and contributions β should never disappear as platforms evolve or close. Launched in 2024, our permanence-first platform gives you full control over how your data is preserved, with transparency, fairness, and infrastructure built to last centuries.
TXTWRK empowers users to choose how their content endures, while offering networks the ability to integrate our API kit to provide the same control to their communities. This ensures a resilient, permanent digital ecosystem that protects history, creativity, and community contributions.
Core Features & Policy
Free Storage: 5GB per user to start, enabling early content contribution.
Lifetime Data Packs: Β£100 per 1GB for additional storage β transparent, fair pricing.
Forever Preservation: Data is retained indefinitely, with optional heavy archival for communities or networks.
Flexible Control: Users can adjust preservation settings for individual content.
Network Integration: API kit allows other platforms to adopt Forever Preservation for their users.
Long-term Reliability: Infrastructure built to scale, survive, and self-manage for centuries.
Storage & Cost Overview
Storage Size
Price (Β£)
Description
5GB
Free
Initial allocation for content creation and posting
1GB
Β£100
Additional permanent storage pack
5GB
Β£500
Expanded legacy storage for creators or startups
10GB+
Β£1,000+
Full archival for heavy contributors, communities, or networks
Why TXTWRK Matters
Preserves digital heritage for centuries, supporting culture and community memory.
Aligns storage with actual cost and long-term value, ensuring sustainability.
Creates a permanence-first culture: encouraging meaningful contributions over ephemeral content.
Supports startups, creators, and networks with equal, transparent pricing.
Join the journey to make your contributions last. Update your settings today, invest in your Forever Data Preservation, and help build a digital ecosystem designed for longevity, resilience, and integrity.
Load Forever Settings
Preservation Status:
Active
Inactive
Save Forever Settings
Partner Network Alliance Integration
We are taking steps to innovate & preserve the world's data for 1000's of years to come. Through innovation, collaboration and friendly donors, we can make this possible. Join the cause via Team@TXTWRK.com to support our community initiative. Join our mission to preserve user data forever, whether youβre a major network like TikTok or a micro network for niche communities. Our project, fueled by community support and donors, ensures public profiles and content live on, even if your service shuts down.
Why it matters:
Preserving data protects usersβ digital legacyβposts, profiles, and contributionsβvital for personal identity, community history, and cultural value.
Requirements:
Submit one request per domain, using your owned domain (e.g., yourdomain.com) and it also helps to make the request from your network/brand page here at TXTWRK such as TXTWRK.com/@TikTok for e.g. or TXTWRK.com/@MyDrivingNetwork
Commitment: If your service closes, you agree to transfer the domain and public user data to us, so we can host profiles at txtwrk.com/network/[yournetwork]/[username]. Our data transfer kit (soon to be developed) will make this seamless, with full transparency about what data will be preserved exactly.
Review process: We evaluate requests for community impact, user value, and alignment with our goal of a resilient digital ecosystem. Submit below and track status in βYour Network Requests.β Contact Team@TXTWRK.com for help. Currently you can install our widget into your settings panel using our Legacy Forecer API kit and your users can set intent today, which helps us understand our role & development better.
Request Network Integration
Select Your Network
Your Networks:
Select a network
Legacy Forever API Kit (kit.php)
Place this file in your /txtwrk/restore/ directory on your server (e.g., yourdomain.com/txtwrk/restore/kit.php). Note: API key is only available for approved networks.
Copy API Kit Code
Settings Widget Code
Paste this code into your settings page where you want the widget to appear. Ensure your session provides $_SESSION['memberID'] (as an integer) or replace with your session-based user ID variable:
Copy Widget Code
Your Network Requests
View the status of your network integration requests.
Load Your Network Requests
Network
Domain
Status
Action
Partner Network Status
View the status of all network partnerships for data preservation.
Load Partner Networks
Review Network Requests
Approve or reject partner network requests for data preservation integration.
Load Review Networks
Network
Domain
Status
Action
Connect Your Server
Verify ownership by uploading a small text file to your server's root directory. This proves you control the domain.
Server Base URL:
Add Server & Get Verification File
1. Create this file on your server
Filename: plug_txtwrk_server.txt Place it in the root directory (where your index.php or homepage lives).Content must be exactly the code below β no extra spaces or newlines at the end.
Copy File Content
2. After uploading the file, click Verify Now in the list below.
Your Connected Servers
Refresh / Load Servers
Messaging Access β
Close
Grant Access
File Access β
Close
Folders (one per line, e.g. /core/dir/123/)
Files (one per line, e.g. file.php or /core/dir/index.php)
Grant File Access
Install TXTWRK Server Bridge
After your server is verified, copy the code below and upload it to:
/server/txtwrk/manage.php
Copy manage.php
Once uploaded, TXTWRK workspaces will be able to connect to your server for file editing, chat, and requests.
<?php
declare(strict_types=1);
/*
TXTWRK client-side server bridge
Location expected:
/server/txtwrk/manage.php
Root resolved as:
/server/txtwrk/../../ => public/server root
*/
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit;
}
$action = $_GET['action'] ?? "list";
$root = realpath(__DIR__ . "/../../");
if (!$root || !is_dir($root)) {
header("Content-Type: application/json; charset=utf-8");
echo json_encode(["success" => false, "error" => "Invalid server root"]);
exit;
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
OUTPUT / BASIC HELPERS
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
function json_out(array $arr): void {
header("Content-Type: application/json; charset=utf-8");
echo json_encode($arr);
exit;
}
function path_inside_root(string $path, string $root): bool {
$root = rtrim($root, DIRECTORY_SEPARATOR);
return $path === $root || strpos($path, $root . DIRECTORY_SEPARATOR) === 0;
}
function normalise_relative_path(string $path): string {
$path = trim($path);
$path = str_replace("\\", "/", $path);
$path = trim($path, "/");
$parts = [];
foreach (explode("/", $path) as $part) {
if ($part === "" || $part === ".") continue;
if ($part === "..") return "";
$parts[] = $part;
}
return implode("/", $parts);
}
function safe_name_only(string $name): string {
$name = trim($name);
$name = str_replace(["\\", "/"], "", $name);
$name = basename($name);
if ($name === "" || $name === "." || $name === "..") {
return "";
}
return $name;
}
function safe_existing_dir(string $root, string $path): ?string {
$path = normalise_relative_path($path);
$target = $path === "" ? $root : realpath($root . "/" . $path);
if (!$target || !is_dir($target) || !path_inside_root($target, $root)) {
return null;
}
return $target;
}
function safe_existing_file(string $root, string $file): ?string {
$file = normalise_relative_path($file);
if ($file === "") return null;
$base = realpath($root . "/" . $file);
if (!$base || !is_file($base) || !path_inside_root($base, $root)) {
return null;
}
return $base;
}
function safe_child_path(string $targetDir, string $name, string $root): ?string {
$safeName = safe_name_only($name);
if ($safeName === "") return null;
$path = $targetDir . "/" . $safeName;
$parentReal = realpath($targetDir);
if (!$parentReal || !path_inside_root($parentReal, $root)) {
return null;
}
return $path;
}
function get_posted_content(): string {
if (isset($_POST['content'])) {
return (string)$_POST['content'];
}
$raw = file_get_contents("php://input");
return $raw === false ? "" : $raw;
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CONTROLLER FILE
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
function controller_file(string $root): string {
return $root . "/server/txtwrk/manage.txtwrk_controller";
}
function default_controller_data(): array {
return [
"messages" => [],
"requests" => [],
"chat_count" => 0
];
}
function read_controller_data(string $root): array {
$flag = controller_file($root);
if (!file_exists($flag)) {
@mkdir(dirname($flag), 0755, true);
file_put_contents($flag, json_encode(default_controller_data(), JSON_PRETTY_PRINT), LOCK_EX);
}
$raw = file_get_contents($flag);
$data = json_decode($raw ?: "", true);
if (!is_array($data)) {
$data = default_controller_data();
}
if (!isset($data["messages"]) || !is_array($data["messages"])) $data["messages"] = [];
if (!isset($data["requests"]) || !is_array($data["requests"])) $data["requests"] = [];
if (!isset($data["chat_count"])) $data["chat_count"] = 0;
return $data;
}
function write_controller_data(string $root, array $data): bool {
$flag = controller_file($root);
@mkdir(dirname($flag), 0755, true);
$fp = fopen($flag, "c+");
if (!$fp) return false;
flock($fp, LOCK_EX);
ftruncate($fp, 0);
rewind($fp);
fwrite($fp, json_encode($data, JSON_PRETTY_PRINT));
fflush($fp);
flock($fp, LOCK_UN);
fclose($fp);
return true;
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
LOCK / EDIT VERSION HELPERS
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
function member_lock_file(string $base, int $memberID): string {
return $base . "." . intval($memberID);
}
function is_edit_version_file(string $path): bool {
return preg_match('/\.txtwrk\.\d+$/', $path) === 1;
}
function is_request_file(string $path): bool {
return preg_match('/\.requests\.\d+$/', $path) === 1;
}
function is_numeric_lock_file(string $path): bool {
if (is_edit_version_file($path)) return false;
if (is_request_file($path)) return false;
return preg_match('/\.\d+$/', $path) === 1;
}
function get_lock_owner(string $base): ?int {
$locks = glob($base . ".*");
if (!$locks) return null;
foreach ($locks as $lock) {
if (!is_numeric_lock_file($lock)) continue;
if (preg_match('/\.(\d+)$/', $lock, $m)) {
return intval($m[1]);
}
}
return null;
}
function find_lock_file(string $base): ?string {
$locks = glob($base . ".*");
if (!$locks) return null;
foreach ($locks as $lock) {
if (is_numeric_lock_file($lock)) {
return $lock;
}
}
return null;
}
function latest_edit_version(string $base): int {
$files = glob($base . ".txtwrk.*");
$latest = 0;
if ($files) {
foreach ($files as $file) {
if (preg_match('/\.txtwrk\.(\d+)$/', $file, $m)) {
$version = intval($m[1]);
if ($version > $latest) {
$latest = $version;
}
}
}
}
return $latest;
}
function edit_version_file(string $base, int $version): string {
return $base . ".txtwrk." . intval($version);
}
function ensure_first_edit_version(string $base): int {
$latest = latest_edit_version($base);
if ($latest > 0) {
return $latest;
}
$content = file_get_contents($base);
if ($content === false) $content = "";
$first = edit_version_file($base, 1);
file_put_contents($first, $content, LOCK_EX);
return 1;
}
function user_owns_lock(string $base, int $memberID): bool {
return file_exists(member_lock_file($base, $memberID));
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
RECURSIVE DELETE
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
function delete_recursive(string $path, string $root): bool {
$real = realpath($path);
if (!$real || !path_inside_root($real, $root) || $real === $root) {
return false;
}
if (is_file($real) || is_link($real)) {
return @unlink($real);
}
if (!is_dir($real)) {
return false;
}
$items = scandir($real);
if ($items === false) {
return false;
}
foreach ($items as $item) {
if ($item === "." || $item === "..") continue;
$child = $real . "/" . $item;
if (!delete_recursive($child, $root)) {
return false;
}
}
return @rmdir($real);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
TARGET PATH
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
$path = normalise_relative_path($_GET['path'] ?? "");
$target = safe_existing_dir($root, $path);
if (!$target) {
json_out([
"success" => false,
"error" => "Invalid path: " . $path
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
SETTINGS
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "settings") {
json_out([
"success" => true,
"settings" => [
"request_poll_interval" => 15000,
"autosave_delay" => 7000
]
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
LIST DIRECTORY
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "list") {
$folders = [];
$files = [];
$items = @scandir($target);
if ($items === false) {
json_out([
"success" => false,
"error" => "Cannot read directory"
]);
}
foreach ($items as $item) {
if ($item === "." || $item === "..") continue;
$full = $target . "/" . $item;
if (is_dir($full)) {
$folders[] = $item;
} else {
$files[] = $item;
}
}
sort($folders);
sort($files);
json_out([
"success" => true,
"path" => $path,
"folders" => $folders,
"files" => $files
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CREATE FOLDER
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "mkdir") {
$name = $_POST['name'] ?? "";
$new = safe_child_path($target, $name, $root);
if (!$new) {
json_out(["success" => false, "error" => "Invalid folder name"]);
}
if (file_exists($new)) {
json_out(["success" => false, "error" => "Folder already exists"]);
}
$ok = @mkdir($new, 0755, true);
json_out($ok
? ["success" => true, "name" => basename($new)]
: ["success" => false, "error" => "Cannot create folder. Check permissions."]
);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CREATE FILE
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "create_file") {
$name = $_POST['name'] ?? "";
$file = safe_child_path($target, $name, $root);
if (!$file) {
json_out(["success" => false, "error" => "Invalid file name"]);
}
if (file_exists($file)) {
json_out(["success" => false, "error" => "File already exists"]);
}
$ok = file_put_contents($file, "") !== false;
json_out($ok
? ["success" => true, "name" => basename($file)]
: ["success" => false, "error" => "Cannot create file. Check permissions."]
);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
RENAME FILE / FOLDER
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "rename") {
$oldName = $_POST['old_name'] ?? "";
$newName = $_POST['new_name'] ?? "";
$oldSafe = safe_name_only($oldName);
$newSafe = safe_name_only($newName);
if ($oldSafe === "" || $newSafe === "") {
json_out(["success" => false, "error" => "Invalid rename value"]);
}
if ($oldSafe === $newSafe) {
json_out(["success" => true, "name" => $newSafe, "message" => "No change"]);
}
$oldPath = $target . "/" . $oldSafe;
$oldReal = realpath($oldPath);
if (!$oldReal || !path_inside_root($oldReal, $root)) {
json_out(["success" => false, "error" => "Original item not found"]);
}
$newPath = $target . "/" . $newSafe;
if (file_exists($newPath)) {
json_out(["success" => false, "error" => "An item with that name already exists"]);
}
/*
If renaming a real source file, also rename its lock/edit/request sidecars.
Example:
index.php
index.php.12
index.php.txtwrk.1
index.php.requests.12
*/
$sidecars = [];
if (is_file($oldReal)) {
$matches = glob($oldReal . ".*");
if ($matches) {
foreach ($matches as $m) {
if (is_file($m)) {
$sidecars[] = $m;
}
}
}
}
$ok = @rename($oldReal, $newPath);
if (!$ok) {
json_out(["success" => false, "error" => "Rename failed. Check permissions."]);
}
foreach ($sidecars as $sidecar) {
$suffix = substr($sidecar, strlen($oldReal));
$newSidecar = $newPath . $suffix;
@rename($sidecar, $newSidecar);
}
json_out([
"success" => true,
"old_name" => $oldSafe,
"new_name" => $newSafe
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
DELETE FILE / FOLDER
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "delete") {
$name = $_POST['name'] ?? "";
$safeName = safe_name_only($name);
if ($safeName === "") {
json_out(["success" => false, "error" => "Missing target"]);
}
$full = $target . "/" . $safeName;
$real = realpath($full);
if (!$real || !path_inside_root($real, $root) || $real === $root) {
json_out(["success" => false, "error" => "Item not found or invalid"]);
}
/*
If deleting a real file, also clear its TXTWRK sidecar files.
If deleting a folder, recursive delete removes everything inside.
*/
if (is_file($real)) {
$sidecars = glob($real . ".*");
$ok = @unlink($real);
if ($ok && $sidecars) {
foreach ($sidecars as $sidecar) {
if (is_file($sidecar) && path_inside_root(realpath($sidecar) ?: "", $root)) {
@unlink($sidecar);
}
}
}
json_out(["success" => $ok]);
}
if (is_dir($real)) {
$ok = delete_recursive($real, $root);
json_out(["success" => $ok]);
}
json_out(["success" => false, "error" => "Unknown item type"]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
FILE UPLOAD
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "upload") {
if (!isset($_FILES['file'])) {
json_out(["success" => false, "error" => "No file uploaded"]);
}
$name = safe_name_only($_FILES['file']['name'] ?? "");
if ($name === "") {
json_out(["success" => false, "error" => "Invalid upload name"]);
}
$dest = $target . "/" . $name;
if (!path_inside_root(dirname($dest), $root)) {
json_out(["success" => false, "error" => "Invalid upload target"]);
}
$ok = move_uploaded_file($_FILES['file']['tmp_name'], $dest);
json_out($ok
? ["success" => true, "name" => $name]
: ["success" => false, "error" => "Upload failed"]
);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
REQUEST FILE ACCESS
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "request_file") {
$file = $_POST['file'] ?? "";
$memberID = (int)($_POST['memberID'] ?? 0);
if (!$file || !$memberID) {
json_out(["success" => false, "error" => "Missing params"]);
}
$base = safe_existing_file($root, $file);
if (!$base) {
json_out(["success" => false, "error" => "Invalid file"]);
}
$currentOwner = get_lock_owner($base);
if (!$currentOwner) {
json_out(["success" => false, "error" => "No current owner"]);
}
if ($currentOwner === $memberID) {
json_out(["success" => false, "error" => "You already own this file"]);
}
$requestFile = $base . ".requests." . $currentOwner;
$list = [];
if (file_exists($requestFile)) {
$json = json_decode(file_get_contents($requestFile) ?: "", true);
if (is_array($json)) $list = $json;
}
foreach ($list as $r) {
if (
isset($r["user"], $r["status"]) &&
(int)$r["user"] === $memberID &&
$r["status"] === "pending"
) {
json_out(["success" => false, "error" => "Already requested"]);
}
}
$list[] = [
"user" => $memberID,
"status" => "pending",
"time" => time()
];
file_put_contents($requestFile, json_encode($list, JSON_PRETTY_PRINT), LOCK_EX);
$data = read_controller_data($root);
$found = false;
foreach ($data["requests"] as &$r) {
if (
isset($r["user"], $r["file"]) &&
(int)$r["user"] === $memberID &&
$r["file"] === normalise_relative_path($file)
) {
$r["count"] = (int)($r["count"] ?? 0) + 1;
$found = true;
break;
}
}
unset($r);
if (!$found) {
$data["requests"][] = [
"user" => $memberID,
"file" => normalise_relative_path($file),
"count" => 1
];
}
write_controller_data($root, $data);
json_out(["success" => true]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
POLL REQUESTS
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "poll_requests") {
$data = read_controller_data($root);
json_out([
"success" => true,
"data" => $data
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
GRANT FILE ACCESS
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "grant_request") {
$file = $_POST['file'] ?? "";
$memberID = (int)($_POST['memberID'] ?? 0);
if (!$file || !$memberID) {
json_out(["success" => false, "error" => "Missing params"]);
}
$file = normalise_relative_path($file);
$base = safe_existing_file($root, $file);
if (!$base) {
json_out(["success" => false, "error" => "Invalid file"]);
}
$currentOwner = get_lock_owner($base);
$currentLockFile = find_lock_file($base);
if (!$currentOwner || !$currentLockFile) {
json_out(["success" => false, "error" => "No current owner"]);
}
$requestFile = $base . ".requests." . $currentOwner;
$queue = [];
if (file_exists($requestFile)) {
$json = json_decode(file_get_contents($requestFile) ?: "", true);
if (is_array($json)) $queue = $json;
}
$queue = array_values(array_filter($queue, function ($r) use ($memberID) {
return !isset($r["user"]) || (int)$r["user"] !== $memberID;
}));
file_put_contents($requestFile, json_encode($queue, JSON_PRETTY_PRINT), LOCK_EX);
$newLock = member_lock_file($base, $memberID);
if (!@rename($currentLockFile, $newLock)) {
json_out(["success" => false, "error" => "Failed transferring ownership"]);
}
$data = read_controller_data($root);
foreach ($data["requests"] as $k => $r) {
if (isset($r["file"]) && $r["file"] === $file) {
unset($data["requests"][$k]);
}
}
$data["requests"] = array_values($data["requests"]);
write_controller_data($root, $data);
json_out([
"success" => true,
"new_owner" => $memberID
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ENSURE EDIT
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "ensure_edit") {
$file = $_POST['file'] ?? "";
$memberID = (int)($_POST['memberID'] ?? 0);
if (!$file || !$memberID) {
json_out(["success" => false, "error" => "Missing parameters"]);
}
$base = safe_existing_file($root, $file);
if (!$base) {
json_out(["success" => false, "error" => "Invalid file"]);
}
$latest = ensure_first_edit_version($base);
$owner = get_lock_owner($base);
$myLock = member_lock_file($base, $memberID);
$readonly = false;
if ($owner && $owner !== $memberID) {
$readonly = true;
} else {
if (!file_exists($myLock)) {
file_put_contents($myLock, "", LOCK_EX);
}
$owner = $memberID;
}
$versionFile = edit_version_file($base, $latest);
$content = file_exists($versionFile) ? file_get_contents($versionFile) : file_get_contents($base);
if ($content === false) $content = "";
json_out([
"success" => true,
"readonly" => $readonly,
"owner" => $owner,
"version" => $latest,
"latestVersion" => $latest,
"content" => $content
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
LOAD LATEST EDIT
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "load_latest_edit") {
$file = $_GET['file'] ?? "";
$base = safe_existing_file($root, $file);
if (!$base) {
json_out(["success" => false, "error" => "Invalid file"]);
}
$latest = ensure_first_edit_version($base);
$versionFile = edit_version_file($base, $latest);
$content = file_exists($versionFile) ? file_get_contents($versionFile) : "";
if ($content === false) $content = "";
json_out([
"success" => true,
"version" => $latest,
"latestVersion" => $latest,
"content" => $content
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
LOAD EDIT VERSION
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "load_edit_version") {
$file = $_GET['file'] ?? "";
$version = (int)($_GET['version'] ?? 0);
if (!$file || $version <= 0) {
json_out(["success" => false, "error" => "Missing file or version"]);
}
$base = safe_existing_file($root, $file);
if (!$base) {
json_out(["success" => false, "error" => "Invalid file"]);
}
$latest = ensure_first_edit_version($base);
$versionFile = edit_version_file($base, $version);
if (!file_exists($versionFile)) {
json_out(["success" => false, "error" => "Version does not exist"]);
}
$content = file_get_contents($versionFile);
if ($content === false) $content = "";
json_out([
"success" => true,
"version" => $version,
"latestVersion" => $latest,
"content" => $content
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
SAVE EDIT VERSION
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "save_edit_version") {
$file = $_POST['file'] ?? ($_GET['file'] ?? "");
$memberID = (int)($_POST['memberID'] ?? ($_GET['memberID'] ?? 0));
$content = get_posted_content();
if (!$file || !$memberID) {
json_out(["success" => false, "error" => "Missing parameters"]);
}
$base = safe_existing_file($root, $file);
if (!$base) {
json_out(["success" => false, "error" => "Invalid file"]);
}
if (!user_owns_lock($base, $memberID)) {
json_out([
"success" => false,
"error" => "You do not own the edit lock",
"expected_lock" => member_lock_file($base, $memberID),
"existing_owner" => get_lock_owner($base),
"latest_version" => latest_edit_version($base)
]);
}
$latest = ensure_first_edit_version($base);
$lastFile = edit_version_file($base, $latest);
$lastContent = file_exists($lastFile) ? file_get_contents($lastFile) : null;
if ($lastContent === $content) {
json_out([
"success" => true,
"version" => $latest,
"latestVersion" => $latest,
"message" => "No change detected"
]);
}
$newVersion = $latest + 1;
$newFile = edit_version_file($base, $newVersion);
$fp = fopen($newFile, "wb");
if (!$fp) {
json_out(["success" => false, "error" => "Unable to create edit version"]);
}
flock($fp, LOCK_EX);
fwrite($fp, $content);
fflush($fp);
flock($fp, LOCK_UN);
fclose($fp);
json_out([
"success" => true,
"version" => $newVersion,
"latestVersion" => $newVersion
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
SAVE BASE FILE
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "save_base") {
$file = $_POST['file'] ?? ($_GET['file'] ?? "");
$memberID = (int)($_POST['memberID'] ?? ($_GET['memberID'] ?? 0));
$content = get_posted_content();
if (!$file || !$memberID) {
json_out(["success" => false, "error" => "Missing parameters"]);
}
$base = safe_existing_file($root, $file);
if (!$base) {
json_out(["success" => false, "error" => "Invalid file"]);
}
if (!user_owns_lock($base, $memberID)) {
json_out([
"success" => false,
"error" => "You do not own the edit lock",
"expected_lock" => member_lock_file($base, $memberID),
"existing_owner" => get_lock_owner($base),
"latest_version" => latest_edit_version($base)
]);
}
$fp = fopen($base, "wb");
if (!$fp) {
json_out(["success" => false, "error" => "Unable to open base file"]);
}
flock($fp, LOCK_EX);
fwrite($fp, $content);
fflush($fp);
flock($fp, LOCK_UN);
fclose($fp);
json_out(["success" => true]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CHECK FILE OWNER
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "check_file_owner") {
$file = $_GET['file'] ?? "";
$base = safe_existing_file($root, $file);
if (!$base) {
json_out(["success" => false, "error" => "Invalid file"]);
}
json_out([
"success" => true,
"owner" => get_lock_owner($base)
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CLOSE SESSION
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "close_session") {
$memberID = (int)($_POST['memberID'] ?? 0);
if (!$memberID) {
json_out(["success" => false, "error" => "Missing memberID"]);
}
$deleted = 0;
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($iterator as $fileInfo) {
if (!$fileInfo->isFile()) continue;
$pathName = $fileInfo->getPathname();
$fileName = $fileInfo->getFilename();
if (is_edit_version_file($fileName)) continue;
if (is_request_file($fileName)) continue;
if (preg_match('/\.' . preg_quote((string)$memberID, '/') . '$/', $fileName)) {
if (@unlink($pathName)) {
$deleted++;
}
}
}
json_out([
"success" => true,
"deleted" => $deleted,
"message" => "Removed {$deleted} lock file(s)"
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CHAT COUNT β INCREMENT
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "increment_chat_count") {
$data = read_controller_data($root);
$data["chat_count"] = (int)($data["chat_count"] ?? 0) + 1;
write_controller_data($root, $data);
json_out([
"success" => true,
"count" => $data["chat_count"]
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CHAT COUNT β GET
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "get_chat_count") {
$data = read_controller_data($root);
json_out([
"success" => true,
"count" => (int)($data["chat_count"] ?? 0)
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
DOWNLOAD SINGLE FILE
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "download") {
$file = $_GET['file'] ?? "";
$base = safe_existing_file($root, $file);
if (!$base) {
http_response_code(404);
exit;
}
header_remove("Content-Type");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"" . basename($base) . "\"");
header("Content-Length: " . filesize($base));
readfile($base);
exit;
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CLEAR EDITS
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "clear_edits") {
$deleted = 0;
if (!is_dir($root) || !is_readable($root)) {
json_out(["success" => false, "error" => "Root not accessible"]);
}
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($iterator as $fileInfo) {
if (!$fileInfo->isFile()) continue;
$fileName = $fileInfo->getFilename();
if (preg_match('/\.txtwrk\.\d+$/', $fileName)) {
if (@unlink($fileInfo->getPathname())) {
$deleted++;
}
}
}
json_out([
"success" => true,
"deleted" => $deleted,
"message" => "Cleared {$deleted} .txtwrk files"
]);
}
/* βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
DOWNLOAD ZIP
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
if ($action === "download_zip") {
$files = $_POST['files'] ?? [];
if (!is_array($files) || empty($files)) {
json_out(["success" => false, "error" => "No files"]);
}
if (!class_exists("ZipArchive")) {
json_out(["success" => false, "error" => "ZipArchive is not enabled on this server"]);
}
$zip = new ZipArchive();
$tmpZip = tempnam(sys_get_temp_dir(), "txtwrk_");
if (!$tmpZip) {
json_out(["success" => false, "error" => "Could not create temporary file"]);
}
$tmpZipPath = $tmpZip . ".zip";
@rename($tmpZip, $tmpZipPath);
if ($zip->open($tmpZipPath, ZipArchive::CREATE) !== true) {
json_out(["success" => false, "error" => "Cannot create ZIP"]);
}
$added = 0;
foreach ($files as $f) {
$relative = normalise_relative_path((string)$f);
$base = safe_existing_file($root, $relative);
if (!$base) continue;
$zip->addFile($base, $relative);
$added++;
$editFiles = glob($base . ".txtwrk.*");
if ($editFiles) {
foreach ($editFiles as $ef) {
if (is_file($ef) && preg_match('/\.txtwrk\.\d+$/', $ef)) {
$zip->addFile($ef, $relative . substr($ef, strlen($base)));
}
}
}
$lockFiles = glob($base . ".*");
if ($lockFiles) {
foreach ($lockFiles as $lf) {
if (!is_file($lf)) continue;
if (is_edit_version_file($lf)) continue;
if (is_request_file($lf)) continue;
if (preg_match('/\.\d+$/', $lf)) {
$zip->addFile($lf, $relative . substr($lf, strlen($base)));
}
}
}
}
$zip->close();
if ($added <= 0) {
@unlink($tmpZipPath);
json_out(["success" => false, "error" => "No valid files added"]);
}
header_remove("Content-Type");
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=\"txtwrk_data.zip\"");
header("Content-Length: " . filesize($tmpZipPath));
readfile($tmpZipPath);
@unlink($tmpZipPath);
exit;
}
json_out([
"success" => false,
"error" => "Unknown action: " . $action
]);
?>
Domains where you can create workspaces
These are your verified servers or servers where someone has granted you file access.
Coins Overview
Hey
Signed in as
You have 0 coins.
Withdraw Funds
Money: Β£0.00
Transaction History
Filter by Status:
All
Purchases
Withdrawals
Pending Withdrawals
Approved Withdrawals
Rejected Withdrawals
Load More
Donations Overview
Signed in as
Total Incoming Donations: 0 (Total: Β£0.00 )
Total Outgoing Donations: 0 (Total: Β£0.00 )
You have the API Kit installed, enabling advanced donation features!
Incoming Donations
Load More
Outgoing Donations
Load More
Investor Overview
Signed in as
Total Investments Developed: 0 (Total Raised: Β£0.00 )
Total Investments Purchased: 0 (Total Invested: Β£0.00 )
Investments Developed
Filter:
All
Search
Load More
Investments Purchased
Filter:
All
Search
Load More
Payee Details
These details will be used when the company/person you invested in needs to pay you (e.g. profit share, dividends, refunds).
People to Pay
Investors who have put money into your projects. Use this to process payments, profit shares, or refunds.
Download People to Pay (CSV)
Load People to Pay
Load More
Business Overview
Signed in as
Total Incoming: Β£0.00
Total Outgoing: Β£0.00
Funding & Product Details
Product Development
Marketing & Customer Acquisition
Hiring & Team Expansion
Research & Innovation
Infrastructure & Operations
Sales & Distribution Channels
Technology & Systems
Legal & Compliance
Mergers & Acquisitions
Global Expansion
Customer Support & Retention
Brand Building & Awareness
Product Testing & Prototyping
Supply Chain & Logistics
Strategic Partnerships & Alliances
Debt Repayment
Working Capital
Sustainability & Green Initiatives
Training & Development
Employee Benefits & Welfare
Market Research & Competitive Analysis
Intellectual Property Protection
Acquiring Intellectual Property
Community Engagement & CSR
Founders Location:
Select countries (hold Ctrl/Cmd)
Abkhazia Afghanistan Albania Algeria American Samoa Andorra Angola Anguilla Antigua and Barbuda Argentina Armenia Aruba Ascension Island Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin Bermuda Bhutan Bolivia Bonaire, Sint Eustatius, and Saba Bosnia and Herzegovina Botswana Brazil British Virgin Islands Brunei Bulgaria Burkina Faso Burma Burundi Cabo Verde Cambodia Cameroon Canada Cayman Islands Central African Republic Chad Channel Islands Chile China Christmas Island Cocos Islands Colombia Comoros Congo (Brazzaville) Congo (Kinshasa) Cook Islands Costa Rica Croatia Cuba CuraΓ§ao Cyprus Czechia Denmark Djibouti Dominica Dominican Republic East Timor Ecuador Egypt El Salvador Equatorial Guinea Eritrea Estonia Eswatini Ethiopia Falkland Islands (Islas Malvinas) Faroe Islands Fiji Finland France French Guiana French Polynesia Gabon Gambia, The Gaza Strip Georgia Germany Ghana Gibraltar Greece Greenland Grenada Guadeloupe Guam Guatemala Guernsey Guinea Guinea-Bissau Guyana Haiti Honduras Hong Kong Hungary Iceland India Indonesia Iran Iraq Ireland Isle of Man Israel Italy Jamaica Japan Jersey Jordan Kazakhstan Kenya Kiribati Korea, North Korea, South Kosovo Kuwait Kyrgyzstan Laos Latvia Lebanon Lesotho Liberia Libya Liechtenstein Lithuania Luxembourg Macau Madagascar Malawi Malaysia Maldives Mali Malta Marshall Islands Martinique Mauritania Mauritius Mayotte Mexico Micronesia, Federated States of Moldova Monaco Mongolia Montenegro Montserrat Morocco Mozambique Namibia Nauru Nepal Netherlands New Caledonia New Zealand Nicaragua Niger Nigeria Niue Norfolk Island North Macedonia Northern Mariana Islands Norway Oman Pakistan Palau Panama Papua New Guinea Paraguay Peru Philippines Pitcairn Islands Poland Portugal Puerto Rico Qatar Reunion Romania Russia Rwanda Saint Barthelemy Saint Helena, Ascension, and Tristan da Cunha Saint Kitts and Nevis Saint Lucia Saint Martin Saint Pierre and Miquelon Saint Vincent and the Grenadines Samoa San Marino Sao Tome and Principe Saudi Arabia Senegal Serbia Seychelles Sierra Leone Singapore Sint Maarten Slovakia Slovenia Solomon Islands Somalia South Africa South Georgia and the South Sandwich Islands South Georgia and South Sandwich Islands South Sudan Spain Sri Lanka Sudan Suriname Svalbard Sweden Switzerland Syria Taiwan Tajikistan Tanzania Thailand Timor-Leste Togo Tonga Trinidad and Tobago Tunisia Turkey Turkmenistan Turks and Caicos Islands Tuvalu U.S. Virgin Islands Uganda Ukraine United Arab Emirates United Kingdom United States Uruguay Uzbekistan Vanuatu Vatican City Venezuela Vietnam Virgin Islands, British Wallis and Futuna West Bank Yemen Zambia Zimbabwe All 1+ Continent
Founders Birth Country:
Select countries (hold Ctrl/Cmd)
Abkhazia Afghanistan Albania Algeria American Samoa Andorra Angola Anguilla Antigua and Barbuda Argentina Armenia Aruba Ascension Island Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin Bermuda Bhutan Bolivia Bonaire, Sint Eustatius, and Saba Bosnia and Herzegovina Botswana Brazil British Virgin Islands Brunei Bulgaria Burkina Faso Burma Burundi Cabo Verde Cambodia Cameroon Canada Cayman Islands Central African Republic Chad Channel Islands Chile China Christmas Island Cocos Islands Colombia Comoros Congo (Brazzaville) Congo (Kinshasa) Cook Islands Costa Rica Croatia Cuba CuraΓ§ao Cyprus Czechia Denmark Djibouti Dominica Dominican Republic East Timor Ecuador Egypt El Salvador Equatorial Guinea Eritrea Estonia Eswatini Ethiopia Falkland Islands (Islas Malvinas) Faroe Islands Fiji Finland France French Guiana French Polynesia Gabon Gambia, The Gaza Strip Georgia Germany Ghana Gibraltar Greece Greenland Grenada Guadeloupe Guam Guatemala Guernsey Guinea Guinea-Bissau Guyana Haiti Honduras Hong Kong Hungary Iceland India Indonesia Iran Iraq Ireland Isle of Man Israel Italy Jamaica Japan Jersey Jordan Kazakhstan Kenya Kiribati Korea, North Korea, South Kosovo Kuwait Kyrgyzstan Laos Latvia Lebanon Lesotho Liberia Libya Liechtenstein Lithuania Luxembourg Macau Madagascar Malawi Malaysia Maldives Mali Malta Marshall Islands Martinique Mauritania Mauritius Mayotte Mexico Micronesia, Federated States of Moldova Monaco Mongolia Montenegro Montserrat Morocco Mozambique Namibia Nauru Nepal Netherlands New Caledonia New Zealand Nicaragua Niger Nigeria Niue Norfolk Island North Macedonia Northern Mariana Islands Norway Oman Pakistan Palau Panama Papua New Guinea Paraguay Peru Philippines Pitcairn Islands Poland Portugal Puerto Rico Qatar Reunion Romania Russia Rwanda Saint Barthelemy Saint Helena, Ascension, and Tristan da Cunha Saint Kitts and Nevis Saint Lucia Saint Martin Saint Pierre and Miquelon Saint Vincent and the Grenadines Samoa San Marino Sao Tome and Principe Saudi Arabia Senegal Serbia Seychelles Sierra Leone Singapore Sint Maarten Slovakia Slovenia Solomon Islands Somalia South Africa South Georgia and the South Sandwich Islands South Georgia and South Sandwich Islands South Sudan Spain Sri Lanka Sudan Suriname Svalbard Sweden Switzerland Syria Taiwan Tajikistan Tanzania Thailand Timor-Leste Togo Tonga Trinidad and Tobago Tunisia Turkey Turkmenistan Turks and Caicos Islands Tuvalu U.S. Virgin Islands Uganda Ukraine United Arab Emirates United Kingdom United States Uruguay Uzbekistan Vanuatu Vatican City Venezuela Vietnam Virgin Islands, British Wallis and Futuna West Bank Yemen Zambia Zimbabwe All 1+ Continent
Product Type:
SaaS (Software as a Service)
FinTech
HealthTech
EdTech
AI & Machine Learning
Blockchain & Crypto
E-commerce & Marketplace
Consumer Goods
Mobility & Transport
GreenTech
Biotech
Cybersecurity
Cloud Computing
AR/VR & Metaverse
Gaming
IoT (Internet of Things)
Agritech
PropTech
Media & Content Creation
Robotics
Electronics
Consumer Technology
Entertainment
Industrial Tech
Smart Devices
Automation
Educational Products
Digital Platforms
Mobile Apps
Community & Social Platforms
Branding & Marketing
Content Creators & Influencers
Creative Arts & Artists
Nonprofit & Social Impact
Fashion & Apparel
Music & Audio
Sports & Fitness
Media & Journalism
Digital Art & NFTs
Crowdfunding Platforms
Consumer Services
Cultural Products & Heritage
Product Description:
Product Revenue Model:
Subscription
One-Time Payment
Freemium
Pay-Per-Use
Ad-Based
Tiered Pricing
Licensing
Crowdfunding
Donation-Based
Product Currency:
Select Currency
USD - United States Dollar
EUR - Euro
GBP - British Pound
JPY - Japanese Yen
AUD - Australian Dollar
CAD - Canadian Dollar
CHF - Swiss Franc
CNY - Chinese Yuan
INR - Indian Rupee
RUB - Russian Ruble
BRL - Brazilian Real
MXN - Mexican Peso
ZAR - South African Rand
KRW - South Korean Won
SGD - Singapore Dollar
HKD - Hong Kong Dollar
SEK - Swedish Krona
NOK - Norwegian Krone
DKK - Danish Krone
NZD - New Zealand Dollar
MYR - Malaysian Ringgit
AED - United Arab Emirates Dirham
SAR - Saudi Riyal
PHP - Philippine Peso
TWD - Taiwan Dollar
IDR - Indonesian Rupiah
EGP - Egyptian Pound
THB - Thai Baht
ILS - Israeli New Shekel
PLN - Polish Zloty
JOD - Jordanian Dinar
Product Price (Range):
Product Availability:
Product Location:
Select a country
Abkhazia Afghanistan Albania Algeria American Samoa Andorra Angola Anguilla Antigua and Barbuda Argentina Armenia Aruba Ascension Island Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin Bermuda Bhutan Bolivia Bonaire, Sint Eustatius, and Saba Bosnia and Herzegovina Botswana Brazil British Virgin Islands Brunei Bulgaria Burkina Faso Burma Burundi Cabo Verde Cambodia Cameroon Canada Cayman Islands Central African Republic Chad Channel Islands Chile China Christmas Island Cocos Islands Colombia Comoros Congo (Brazzaville) Congo (Kinshasa) Cook Islands Costa Rica Croatia Cuba CuraΓ§ao Cyprus Czechia Denmark Djibouti Dominica Dominican Republic East Timor Ecuador Egypt El Salvador Equatorial Guinea Eritrea Estonia Eswatini Ethiopia Falkland Islands (Islas Malvinas) Faroe Islands Fiji Finland France French Guiana French Polynesia Gabon Gambia, The Gaza Strip Georgia Germany Ghana Gibraltar Greece Greenland Grenada Guadeloupe Guam Guatemala Guernsey Guinea Guinea-Bissau Guyana Haiti Honduras Hong Kong Hungary Iceland India Indonesia Iran Iraq Ireland Isle of Man Israel Italy Jamaica Japan Jersey Jordan Kazakhstan Kenya Kiribati Korea, North Korea, South Kosovo Kuwait Kyrgyzstan Laos Latvia Lebanon Lesotho Liberia Libya Liechtenstein Lithuania Luxembourg Macau Madagascar Malawi Malaysia Maldives Mali Malta Marshall Islands Martinique Mauritania Mauritius Mayotte Mexico Micronesia, Federated States of Moldova Monaco Mongolia Montenegro Montserrat Morocco Mozambique Namibia Nauru Nepal Netherlands New Caledonia New Zealand Nicaragua Niger Nigeria Niue Norfolk Island North Macedonia Northern Mariana Islands Norway Oman Pakistan Palau Panama Papua New Guinea Paraguay Peru Philippines Pitcairn Islands Poland Portugal Puerto Rico Qatar Reunion Romania Russia Rwanda Saint Barthelemy Saint Helena, Ascension, and Tristan da Cunha Saint Kitts and Nevis Saint Lucia Saint Martin Saint Pierre and Miquelon Saint Vincent and the Grenadines Samoa San Marino Sao Tome and Principe Saudi Arabia Senegal Serbia Seychelles Sierra Leone Singapore Sint Maarten Slovakia Slovenia Solomon Islands Somalia South Africa South Georgia and the South Sandwich Islands South Georgia and South Sandwich Islands South Sudan Spain Sri Lanka Sudan Suriname Svalbard Sweden Switzerland Syria Taiwan Tajikistan Tanzania Thailand Timor-Leste Togo Tonga Trinidad and Tobago Tunisia Turkey Turkmenistan Turks and Caicos Islands Tuvalu U.S. Virgin Islands Uganda Ukraine United Arab Emirates United Kingdom United States Uruguay Uzbekistan Vanuatu Vatican City Venezuela Vietnam Virgin Islands, British Wallis and Futuna West Bank Yemen Zambia Zimbabwe All 1+ Continent
Product Audience:
B2B (Business to Business)
B2C (Business to Consumer)
Enterprise Customers
Startups
Government & Public Sector
Students & Educational Institutions
NGOs & Nonprofits
Charities
Retailers & Merchants
Healthcare Providers
AI Data Developers
Market Size:
Product Age Range:
0-5 Years
6-10 Years
11-15 Years
16-20 Years
21-30 Years
31-40 Years
41-50 Years
51-60 Years
61-70 Years
71-80 Years
81-90 Years
91-100 Years
Environmental Duty:
Fully Embracing (Green)
Incorporating Sustainability
Considering Environmental Impact
Neutral (Minimal Impact)
No Impact
Carbon Offset
Eco-Friendly Practices
Environmentally Conscious
Recyclable Materials
Not Applicable
Innovation Level:
Product Innovation
Design Innovation
Technology Innovation
Sustainability Innovation
Service Innovation
Business Model Innovation
Market Innovation
Efficiency Innovation
User Experience Improvement
None
Exit Option:
Select Exit Option
IPO
Merger
Acquisition
Licensing
Private Sale
Bankruptcy
Secondary Market
Share Buyback
Dividend Payouts
Recapitalization
Debt Financing
Strategic Partnership
Management Buyout (MBO)
Employee Buyout (EBO)
Liquidation
Other
Exit Target Date:
Save Funding Details
Business Opportunities
Create partnership, sponsorship or grant opportunities for business, community or education development.
View Opportunities Made
+ New Business Opportunity
My Opportunities
Click βView Opportunities Madeβ to load your opportunities.
Business Opportunities Profile Module
Choose whether your Business Opportunities module appears on your profile. This setting applies to the module as a whole.
Individual opportunities still use their own Visibility and Status settings.
Profile Display:
Do not feature on profile
Feature on my profile
Save Profile Display Setting
Business Applications
Apply for public open partnership, sponsorship or grant opportunities. Your applications made will appear below.
Business Applications Made
Your latest applications will appear here.
View More Applications
Questionnaires
Create questionnaire sets from your existing public post questions. These can be used for communities, enrolment, business feedback, event interest, community questions and customer insight.
View Questionnaire Settings
+ New Questionnaire
My Questionnaires
Click βView Questionnaire Settingsβ to load your questionnaires.
Questionnaire Profile Module
Choose whether your questionnaire module appears on your profile. This setting applies to all questionnaires.
Individual questionnaires can still be set as Draft, Published, or Ended.
Profile Display:
Do not feature on profile
Feature on my profile
Save Profile Display Setting
Search Organisations
Here you can add your organisation to a group to consolidate feedback.
Selected Organisations
Confirm Selection
My Organisations
Ad Credits Overview
Hey
Signed in as
You have 0 ad credits.
Buy Ad Credits
Credits: 0
Transaction History
Filter by Type:
All
Purchases
Load More
Create or Modify Advert
Make/Update an Advert
Subscription Overview
Hey
Signed in as
Your plan: Free
Expiry: -
Learn About Premium
Upgrade to Premium and get early access to:
Now Available...
Set Feed Landing
Get Subscribers & get paid 100% via PayPal*
Label people & access them in features
Supporting early helps us grow faster
...list in update
Coming soon in additional Tiers...
AI-powered image & video post creation
Next-gen checklist tools (open-source)
Organise your quick panel icons
Spaces: Custom dashboards for your work
Share spaces and summaries
More in dev!
Premium will be our main Tier alongside Platinum in development, where we will have Additional Tiers such as 1. Our AI tool and 2. Storage Tiers. Premium will eventually have 30 perks, platinum will have 100!
By making your own Tiers in Get Subscribers, you can set the price of the Tier, make it active/inactive, delete it if you have no existing subscribers with it and define it via our post creation box or update the PPV settings in Manage on a post.
Subscribe Now
1 Year Premium (Β£100)
3 Years Premium (Β£200, Save Β£100)
Confirm Selection
Upgrade to Premium
Connected to many TXTWRK features across our network, designed to bring people and communities closer to you.
View Examples
Select a Country to see hierarchy examples:
β°
Code Playground
HTML/CSS/JS
Python
C
C++
Java
Run βΆ
Close β
RSS News Populator
Fetch safe public RSS news articles for review. All valid articles are selected by default.
Click a row to deselect/reselect it, then import selected rows into TXTWRK Trending Topics.
Review RSS Articles
Selected rows will be imported as topics with user_id = 0 .
Last Imported
Manage your pages, employees, workplace confirmations, volunteers, writers and checklisting links.
Workplaces
All
Confirmed
Pending
View More
Writers & Journalists
All
My Applications
Writer Requests
+ Apply to Page
View More
Dashboard | Advertisements
Advertising Innovation
Welcome to our Advertising Hub, where the future of advertising unfolds. Discover cutting-edge advertising models and opportunities to promote your brand across various platforms using AI, VR, AR, and more.
+ Futuristic Advertising
Explore how emerging technologies like AI, Virtual Reality (VR), and Augmented Reality (AR) are reshaping advertising. From immersive experiences to personalized ads, the future of advertising is here.
+ Real World & Hybrid Advertising
Learn about innovative advertising strategies that blend digital and physical worlds, creating impactful, hybrid campaigns that reach audiences everywhere.
+ Promoting Your Post
Discover how to amplify your content's reach on our platform and beyond, ensuring your message resonates with the right audience.
+ Group Advertising
Join forces with others to create powerful, collaborative ad campaigns. Group advertising can maximize visibility and impact, providing a cost-effective solution for broader reach.
+ Innovation & The Future
Dive into the future of advertising, exploring how innovation drives new opportunities for engagement and storytelling.
+ Get Involved
Whether you're a startup, a media agency, or a community cause, learn how you can leverage our platform for your advertising needs.
+ Media Agencies
If you represent a media agency looking for innovative advertising solutions, discover how our platform can enhance your campaigns and deliver exceptional results.
+ Share Your Story
Advertising with a cause? We support community-driven initiatives and provide a platform to share your story, driving awareness and support for your cause.
+ Contact Us
Ready to take your advertising to the next level? Get in touch with our team to discuss innovative solutions tailored to your brand's needs.