diff --git a/apps/infra/accounts_app/views/billing_views.py b/apps/infra/accounts_app/views/billing_views.py index e206033fe..6017b2d04 100644 --- a/apps/infra/accounts_app/views/billing_views.py +++ b/apps/infra/accounts_app/views/billing_views.py @@ -95,21 +95,6 @@ def payment_step(request): # the "any existing user can enter the signup payment flow" defect. return redirect("accounts_app:billing") - if not card_registration_is_open(): - # No card can be taken yet (provider not configured). Still render THIS - # step rather than borrowing the generic billing page: the funnel stays one - # coherent step, and the surface carries its own marker so both a reader and - # a test can tell which step they are on. - disclosures = payment_disclosures( - plan_label="", - monthly_usd=0.0, - trial_end=None, - state=NOT_OPEN, - ) - return render(request, "accounts_app/payment_step.html", disclosures.as_context()) - - # Which plan a new signup is put on must be DETERMINED and CHARGEABLE, not - # whichever catalog row comes first and not whatever ``?plan=`` names. # # Free first: a $0 plan recorded on the authority owes no card and no # provider round-trip (it can never be on the chargeable allowlist, by @@ -126,6 +111,21 @@ def payment_step(request): mark_activated(user, pricing_id=free_row["id"]) return redirect(first_product_url()) + if not card_registration_is_open(): + # No card can be taken yet (provider not configured). Still render THIS + # step rather than borrowing the generic billing page: the funnel stays one + # coherent step, and the surface carries its own marker so both a reader and + # a test can tell which step they are on. + disclosures = payment_disclosures( + plan_label="", + monthly_usd=0.0, + trial_end=None, + state=NOT_OPEN, + ) + return render(request, "accounts_app/payment_step.html", disclosures.as_context()) + + # Which plan a new signup is put on must be DETERMINED and CHARGEABLE, not + # whichever catalog row comes first and not whatever ``?plan=`` names. row = funnel_plan(user, requested_id=request.GET.get("plan")) # The way the last attempt ended, read from the provider's return markers. diff --git a/apps/infra/auth_app/views/theme.py b/apps/infra/auth_app/views/theme.py index 068f68585..b783fde0e 100644 --- a/apps/infra/auth_app/views/theme.py +++ b/apps/infra/auth_app/views/theme.py @@ -5,14 +5,10 @@ Theme resolution contract: - The BASE default is DARK for every first visit, on every viewport. -- Only a REGISTERED user's EXPLICITLY saved profile preference is - served as a preference (``source: "profile"``); everything else is - served as a default (``source: "default"``) so the client can let an - explicit prior localStorage choice win over it. A profile row is - auto-created at registration with the dark default, so row existence - alone must NOT count as a saved preference (UserProfile.theme_explicit - gates it) — otherwise every login would clobber a stored light choice - back to dark. +- Only a REGISTERED user's saved profile preference is served as a + preference (``source: "profile"``); everything else is served as a + default (``source: "default"``) so the client can let an explicit + prior localStorage choice win over it. """ from __future__ import annotations @@ -118,11 +114,7 @@ def api_get_theme_preference(request): "source": "profile" | "default" } - ``source: "profile"`` only for an authenticated user whose profile - row carries an EXPLICITLY saved choice (theme_explicit). A row that - merely exists (auto-created at registration with the dark default) - is served as ``source: "default"`` so the client lets a stored - browser choice win. + ``source: "profile"`` only for an authenticated user's saved row. """ if not request.user.is_authenticated: return JsonResponse(dict(_DEFAULT_THEME_RESPONSE)) diff --git a/apps/infra/public_app/templates/public_app/landing.html b/apps/infra/public_app/templates/public_app/landing.html index 7547c7c54..4ff1926ab 100644 --- a/apps/infra/public_app/templates/public_app/landing.html +++ b/apps/infra/public_app/templates/public_app/landing.html @@ -3,6 +3,7 @@ {% load static vite i18n %} {% block title %}{% trans "SciTeX — A platform for science" %}{% endblock %} +{% block meta_description %}{% trans "Connect literature, files, analysis, figures, writing, and compute in one SciTeX project context." %}{% endblock %} {% block extra_css %} diff --git a/apps/infra/public_app/templates/public_app/landing_partials/landing_hero.html b/apps/infra/public_app/templates/public_app/landing_partials/landing_hero.html index 3292fd011..fcdf5cf99 100644 --- a/apps/infra/public_app/templates/public_app/landing_partials/landing_hero.html +++ b/apps/infra/public_app/templates/public_app/landing_partials/landing_hero.html @@ -5,40 +5,33 @@

{% trans "Open research infrastructure" %}

- - {% trans "Where Research Happens" %} + {% trans "A platform" %} + {% trans "for science." %}

- - +

+ {% trans "Literature, files, analysis, figures, writing, and agents in one connected project." %} +

+

+ {% trans "Review from your phone. Work in the browser. Run where compute lives." %}

-
{% trans "Try SciTeX™ Cloud with 30-day Free Trial" %} - {% trans "See Plans" %} - {% trans "View in GitHub" %} + {% trans "See pricing" %}
- - - +

+ {% trans "Already have an account?" %} + {% trans "Sign in" %} +

+

+ {% blocktrans with version=SCITEX_HUB_VERSION %}Alpha Release ({{ version }}) — Data persistence and API stability are not guaranteed. For production use, install the local Python toolkit. Any contribution welcome:{% endblocktrans %} + {{ CONTACT_EMAIL }} +

+
@@ -51,19 +44,19 @@

fetchpriority="high" alt="{% trans 'Two laboratory researchers review a microscopic image on a laptop while one holds a clipboard.' %}" /> - +
+ {% trans "Research is human work." %} + + {% trans "Illustrative stock photography:" %} + Edward Jenner / Pexels + · {% trans "Pexels license" %}. + {% trans "The people shown are not SciTeX customers, employees, or endorsers; no endorsement is implied." %} + +

diff --git a/apps/infra/public_app/templates/public_app/landing_partials/landing_modules.html b/apps/infra/public_app/templates/public_app/landing_partials/landing_modules.html index 990c486a5..0c46d7bba 100644 --- a/apps/infra/public_app/templates/public_app/landing_partials/landing_modules.html +++ b/apps/infra/public_app/templates/public_app/landing_partials/landing_modules.html @@ -1,14 +1,89 @@ {% load static i18n %} -
+
+
+
+
+

{% trans "One project, every place" %}

+

{% trans "The same context, from phone to compute node." %}

+
+

{% trans "Move between a quick mobile review, focused browser work, and HPC over SSH without rebuilding the project around each device." %}

+
+
    +
  1. + +

    {% trans "Phone" %}

    +

    {% trans "Review a result, save a paper, or capture the next step." %}

    +
  2. +
  3. + +

    {% trans "Laptop" %}

    +

    {% trans "Use the browser for daily analysis, figures, and writing." %}

    +
  4. +
  5. + +

    {% trans "HPC + SSH" %}

    +

    {% trans "Run near the scheduler and data while the project stays connected." %}

    +
  6. +
  7. + +

    {% trans "Custom Apps" %}

    +

    {% trans "Extend the same project and command contract for your lab." %}

    +
  8. +
+
+
+ +

{% trans "Built in, connected by design" %}

-

{% trans "SciTeX Cloud — one project context" %} #

+

{% trans "SciTeX Hub — one project context" %}

{% trans "Each built-in app specializes. Hub keeps project, files, identity, and commands connected. Custom Apps sit outside the built-ins and extend the same contract." %}

+

- {% trans "Unedited interface captures from tracked product-guide screenshots and the development Stats app; resize and compression only." %} + {% trans "Unedited interface captures from tracked product-guide screenshots; resize and compression only." %}

- {# Live app entries: the carousel above is screenshots, not navigation. #} - {# These are the real deep-links — auth-aware (B1 beta triage). #} -
-

{% trans "Verifiable provenance" %}

-

{% trans "Trace a claim back to its source." %} #

-

{% trans "SciTeX Clew records relationships between research artifacts in a directed acyclic graph, connecting a manuscript claim to output, processing, and raw data, and resolving the shortest path between them. A “clew” is Ariadne’s ball of thread from Greek mythology, given to Theseus to navigate the Labyrinth and escape the Minotaur — our thread leads back from claim to source." %}

+

{% trans "Follow a claim back to its source." %}

+

{% trans "SciTeX Clew records relationships between research artifacts in a directed acyclic graph. The public example connects a manuscript claim to output, processing, and raw data." %}

  1. {% trans "Claim" %}
  2. {% trans "Output" %}
  3. @@ -162,88 +205,23 @@

    {% trans "Trace a claim back to its source." %} < target="_blank" rel="noopener noreferrer">{% trans "View the public Clew repository" %}

-
- -
{% trans "Short concept clip: follow the thread from claim back to source." %}
-
-
-
- -
-
-
-
-

{% trans "One project, every place" %}

-

{% trans "The same context, from phone to compute node." %} #

-
-

{% trans "Move between a quick mobile review, focused browser work, and HPC over SSH without rebuilding the project around each device." %}

-
-
    -
  1. - -

    {% trans "Phone" %}

    -

    {% trans "Review results, save papers, or capture the next step — from anywhere, even your bed." %}

    -
  2. -
  3. - -

    {% trans "Laptop" %}

    -

    {% trans "Daily analysis, figures, and writing in the browser — wherever you work." %}

    -
  4. -
  5. - -

    {% trans "SciTeX Cloud Server" %}

    -

    {% trans "Collaborate with colleagues on private and public projects in one connected workspace." %}

    -
  6. -
  7. - -

    {% trans "HPC" %}

    -

    {% trans "Heavy compute next to the scheduler and data — without leaving the project." %}

    -
  8. - -
-
-
- -
-
-
-

{% trans "Build on SciTeX" %}

-

{% trans "Create your own app with the SDK." %} #

-

{% trans "Research is novel by definition: predefined products rarely cover the experiment in front of you. Custom Apps let you build the data-collection and experiment tools your work actually needs, on the shared foundation you already have: users, projects, authentication, file storage, background compute, and AI." %}

-

{% trans "The SDK provides DataStore (structured records), FileVault (project files), and JobQueue (background jobs) through a Python API, CLI, and MCP tools. Built-in skills let you create apps through interactive conversation with AI agents, and validators check each app before it runs." %}

-

{% trans "Apps are just repositories: use, share, and co-develop them like code, and publish one alongside your paper so readers can run the experiment, not just read about it." %}

- -

{% trans "Published apps live in the SciTeX App Store. Native mobile stores (Apple App Store / Google Play) are planned — not yet available." %}

-
    -
  • {% trans "DataStore, FileVault, JobQueue: records, files, and compute" %}
  • -
  • {% trans "Skills and validators: build with agents, ship with confidence" %}
  • -
  • {% trans "Repos you can share: executable companions to your papers" %}
  • -
- {% trans "Start building" %} -
-
- {% trans 'SciTeX App Creator: name your app, describe what it should do, pick a starter template, and create it.' %} +
+ + + {% trans 'SciTeX Clew directed acyclic graph connecting manuscript claims, derived outputs, processing steps, and raw data.' %} + +
{% trans "Actual DAG from the public scitex-clew repository." %}
-
+
@@ -256,14 +234,21 @@

{% trans "Create your own app with the SDK. loading="lazy" alt="{% trans 'A laboratory researcher works at a desktop computer beside scientific equipment.' %}" /> +
+ {% trans "Illustrative stock photography:" %} + Tima Miroshnichenko / Pexels. + {% trans "No customer or product endorsement is implied." %} +

{% trans "Open by design" %}

-

{% trans "Bring your own projects, collaborators, data, compute, and API keys." %} #

-

{% trans "Your research. Your infrastructure. Your assets stay yours: connect the machines, datasets, and keys you already have and use them at full value, with no platform markup and nothing locked in. Use SciTeX Cloud or self-host, keep human judgment at the center, and plug in whatever the work needs." %}

+

{% trans "Your research. Your infrastructure." %}

+

{% trans "Use SciTeX Cloud or self-host. Keep human judgment at the center and choose the environment, compute, and integrations that fit the work." %}

  • {% trans "Cloud for a managed browser workspace" %}
  • -
  • {% trans "Self-hosting for your own environment, such as local AI models" %}
  • +
  • {% trans "Self-hosting for your own environment" %}
  • {% trans "Custom Apps for field-specific workflows" %}

{% trans "Available deployment options and integrations depend on the selected setup." %}