Skip to content

project ​

pfy project lists, creates, reads, updates, and deletes projects on the Manager. A project is the top-level unit: tenants, applications, environments, and language packs all belong to one.

Synopsis ​

bash
pfy project <subcommand> [flags]

Aliases: p

Description ​

Projects are the highest level of organization in ProductifyFW. Each project can contain multiple tenants and serves as a complete product or service unit.

Subcommands ​

  • list - List all projects
  • create - Create a new project
  • get - Get project details by slug
  • update - Update a project's name or description
  • delete - Delete a project (prompts for confirmation; requires --yes with --ci)

project list ​

List all projects you have access to.

Usage ​

bash
pfy project list [flags]

Example ​

bash
pfy project list

Output:

Projects:
  - My SaaS Platform (my-saas)
  - E-commerce Store (ecommerce)
2 projects

--limit <n> returns exactly n rows; --offset <n> skips the first n. Without --limit, every project is fetched. -o json prints the list as JSON.

Verbose output:

bash
pfy --verbose project list
Connecting to ProductifyFW manager...
Fetching projects list...
Found 2 project(s)
Projects:
  - My SaaS Platform (my-saas)
    ID: 01234567-89ab-cdef-0123-456789abcdef
  - E-commerce Store (ecommerce)
    ID: 12345678-9abc-def0-1234-56789abcdef0
2 projects

project create ​

Create a new project with a unique slug.

Usage ​

bash
pfy project create --slug <slug> --name <name> [--description <desc>]

Flags ​

FlagRequiredDescription
--slugYesProject slug (unique identifier, lowercase, hyphen-separated)
--nameYesProject display name
--descriptionNoProject description

Examples ​

Basic creation:

bash
pfy project create \
  --slug my-project \
  --name "My Project"

With description:

bash
pfy project create \
  --slug my-saas \
  --name "My SaaS Platform" \
  --description "A multi-tenant SaaS application for customer management"

Output:

Project created successfully: My SaaS Platform (my-saas)

Verbose output:

bash
pfy --verbose project create \
  --slug my-saas \
  --name "My SaaS Platform" \
  --description "A multi-tenant SaaS application"
Connecting to ProductifyFW manager...
Creating project with slug 'my-saas'...
Project created successfully: My SaaS Platform (my-saas)
  ID: 01234567-89ab-cdef-0123-456789abcdef

project get ​

Retrieve detailed information about a specific project.

Usage ​

bash
pfy project get --slug <slug>

Flags ​

FlagRequiredDescription
--slugYesProject slug

Example ​

bash
pfy project get --slug my-saas

Output:

Project: My SaaS Platform (my-saas)
ID: 01234567-89ab-cdef-0123-456789abcdef

get resolves by slug only. To look a project up by ID use pfy sync --project <id> or pfy -o json project list.

project update ​

Change a project's name and/or description.

Usage ​

bash
pfy project update <slug|id> [--name <name>] [--description <desc>]
FlagDescription
--slugTarget slug (or pass it positionally). A UUID value is treated as an ID
--idTarget by ID explicitly (for the rare slug that looks like a UUID)
--nameNew project name
--descriptionNew project description

At least one of --name or --description is required.

bash
pfy project update my-saas --name "My SaaS Platform v2"
Project updated: My SaaS Platform v2 (my-saas)

project delete ​

Delete a project.

Usage ​

bash
pfy project delete <slug|id> [--yes]
FlagAliasesDescription
--yes-ySkip the confirmation prompt. Required under --ci or when stdin is not a terminal

On a terminal you must type the slug back to confirm:

This permanently deletes project "my-saas". Type "my-saas" to confirm: my-saas
Deleted project My SaaS Platform (my-saas)

Without a terminal (or with --ci) and without --yes:

Error: refusing to delete project "my-saas" without confirmation: re-run with --yes (required under --ci or without a TTY)

GraphQL Operations ​

The project commands use these GraphQL operations:

GetProjects ​

graphql
query GetProjects(
  $filters: [FilterInput!]
  $order: [OrderInput!]
  $pagination: PaginationInput
) {
  projects(filters: $filters, order: $order, pagination: $pagination) {
    id
    slug
    name
  }
}

GetProject ​

graphql
query GetProject($slug: String!) {
  project(slug: $slug) {
    id
    slug
    name
  }
}

CreateProject ​

graphql
mutation CreateProject($input: CreateProjectInput!) {
  createProject(input: $input) {
    id
    slug
    name
  }
}

Common Workflows ​

Create a complete project structure ​

bash
# Create project
pfy project create \
  --slug my-app \
  --name "My Application" \
  --description "Production application"

# Get project ID
PROJECT_ID=$(pfy project get --slug my-app | grep "ID:" | awk '{print $2}')

# Create development tenant
pfy tenant create \
  --project-id $PROJECT_ID \
  --slug dev \
  --name "Development"

# Create production tenant
pfy tenant create \
  --project-id $PROJECT_ID \
  --slug prod \
  --name "Production"

List and filter projects ​

bash
# List all projects
pfy project list

# With verbose details (adds ID lines)
pfy --verbose project list

# Machine-readable
pfy -o json project list | jq -r '.[].slug'

Verify project exists ​

bash
if pfy project get --slug my-project &> /dev/null; then
    echo "Project exists"
else
    echo "Project not found"
fi

Best Practices ​

  1. Use descriptive slugs that are memorable and URL-friendly
  2. Include a description of the project's purpose
  3. Follow one naming convention across projects
  4. Use lowercase and hyphens in slugs: my-project-name

Error Handling ​

Errors from the Manager are printed after a prefix naming the operation (failed to create project:, failed to get project:, ...); the text after the prefix is the Manager's own message. Typical causes:

  • Slug already taken on create: choose another slug or update the existing project.
  • Project not found on get/update/delete: check the slug with pfy project list.
  • Invalid slug on create: use lowercase letters, digits, and hyphens.

A token rejected or cannot reach manager error is about your connection, not the project; see Configuration.

See Also ​